Bạn có thể sử dụng screen
tính năng phân chia dọc của GNU :
#! /bin/bash -
tmpdir=$(mktemp -d) || exit
trap 'rm -rf "$tmpdir"' EXIT INT TERM HUP
FIFO=$tmpdir/FIFO
mkfifo "$FIFO" || exit
conf=$tmpdir/conf
cat > "$conf" << 'EOF' || exit
split -v
focus
screen -t stderr sh -c 'tty > "$FIFO"; read done < "$FIFO"'
focus
screen -t stdout sh -c 'read tty < "$FIFO"; eval "$CMD" 2> "$tty"; echo "[Command exited with status $?, press enter to exit]"; read prompt; echo done > "$FIFO"'
EOF
CMD="$*"
export FIFO CMD
screen -mc "$conf"
Để sử dụng ví dụ như:
that-script 'ls / /not-here'
Ý tưởng là nó chạy màn hình với một tệp conf tạm thời bắt đầu hai cửa sổ màn hình theo bố cục chia dọc. Trong cái đầu tiên, chúng tôi chạy lệnh của bạn với stderr được kết nối với cái thứ hai.
Chúng tôi sử dụng một ống có tên cho cửa sổ thứ hai để giao tiếp thiết bị tty của nó với cửa sổ thứ nhất và cũng là ống thứ nhất để nói với ống thứ hai khi lệnh được thực hiện.
Ưu điểm khác so với các cách tiếp cận dựa trên đường ống là thiết bị xuất chuẩn và thiết bị xuất chuẩn vẫn được kết nối với các thiết bị tty, do đó nó không ảnh hưởng đến bộ đệm. Cả hai tấm cũng có thể được cuộn lên xuống một cách độc lập (sử dụng screen
chế độ sao chép).
Nếu bạn chạy shell như bash
tương tác với tập lệnh đó, bạn sẽ thấy dấu nhắc sẽ được hiển thị trên cửa sổ thứ hai, trong khi shell sẽ đọc nội dung bạn nhập trong cửa sổ đầu tiên khi các shell đó xuất ra dấu nhắc của chúng trên stderr.
Trong trường hợp bash
, tiếng vang của những gì bạn gõ cũng sẽ xuất hiện trên cửa sổ thứ hai vì tiếng vang đó được xuất ra bởi vỏ (đường dẫn trong trường hợp bash
) trên stderr. Với một số shell khác ksh93
, nó sẽ hiển thị trên cửa sổ đầu tiên ( đầu ra echo của trình điều khiển thiết bị đầu cuối, không phải shell), trừ khi bạn đặt shell trong emacs
hoặc vi
chế độ với set -o emacs
hoặc set -o vi
.