Możesz użyć screen
funkcji podziału pionowego 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"
Aby użyć na przykład jako:
that-script 'ls / /not-here'
Chodzi o to, że uruchamia on ekran z tymczasowym plikiem conf, który uruchamia dwa okna ekranu w układzie podziału pionowego. W pierwszym uruchamiamy twoje polecenie z stderr podłączonym do drugiego.
Używamy nazwanego potoku dla drugiego okna, aby przekazać jego urządzenie tty do pierwszego, a także dla pierwszego, aby poinformować drugie, kiedy polecenie zostanie wykonane.
Inną zaletą w porównaniu z podejściami opartymi na potokach jest to, że stdout i stderr polecenia są nadal podłączone do urządzeń tty, więc nie wpływa to na buforowanie. Oba panele można również przewijać niezależnie w górę i w dół (w screen
trybie kopiowania).
Jeśli uruchomisz powłokę podobnie jak bash
interaktywnie z tym skryptem, zauważysz, że monit zostanie wyświetlony w drugim oknie, podczas gdy powłoka będzie czytać to, co wpiszesz w pierwszym oknie, gdy powłoki wyrzucają swój monit na stderr.
W przypadku bash
, w echo tego, co piszesz pojawi się również na drugim oknie jako że echo jest wyprowadzany przez powłokę (readline w przypadku bash
) na stderr, jak również. Z niektórych innych skorup podoba ksh93
, to pokaże na pierwszym oknie ( echo wyjście na terminalu sterownika, a nie shell), chyba że można umieścić w powłokę emacs
lub vi
tryb z set -o emacs
lub set -o vi
.