Anda dapat menggunakan screen
fitur pemisahan vertikal 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"
Untuk digunakan misalnya sebagai:
that-script 'ls / /not-here'
Idenya adalah bahwa ia menjalankan layar dengan file conf sementara yang memulai dua jendela layar dalam tata letak split vertikal. Di yang pertama, kami menjalankan perintah Anda dengan stderr terhubung ke yang kedua.
Kami menggunakan pipa bernama untuk jendela kedua untuk mengkomunikasikan perangkat tty-nya ke yang pertama, dan juga untuk yang pertama memberi tahu yang kedua ketika perintah dilakukan.
Keuntungan lain dibandingkan dengan pendekatan berbasis pipa adalah stdout dan stderr perintah masih terhubung ke perangkat tty, sehingga tidak mempengaruhi buffering. Kedua panel juga dapat digulir ke atas dan ke bawah secara independen (menggunakan screen
mode salin).
Jika Anda menjalankan shell seperti bash
berinteraksi dengan skrip itu, Anda akan melihat prompt akan ditampilkan di jendela kedua, sementara shell akan membaca apa yang Anda ketikkan di jendela pertama saat shell-shell tersebut mengeluarkan prompt mereka di stderr.
Dalam hal ini bash
, gema dari apa yang Anda ketik juga akan muncul di jendela kedua karena gema itu dihasilkan oleh shell (readline dalam kasus bash
) pada stderr juga. Dengan beberapa shell lain seperti ksh93
, itu akan ditampilkan di jendela pertama ( gema output oleh driver perangkat terminal, bukan shell), kecuali jika Anda meletakkan shell dalam emacs
atau vi
mode dengan set -o emacs
atau set -o vi
.