È possibile utilizzare la screen
funzione di divisione verticale di 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"
Per usare ad esempio come:
that-script 'ls / /not-here'
L'idea è che esegue lo schermo con un file di configurazione temporaneo che avvia due finestre dello schermo in un layout diviso verticale. Nel primo, eseguiamo il tuo comando con lo stderr collegato al secondo.
Usiamo una pipe denominata per la seconda finestra per comunicare il suo dispositivo tty alla prima, e anche per la prima per dire alla seconda quando il comando è fatto.
L'altro vantaggio rispetto agli approcci basati su pipe è che lo stdout e lo stderr del comando sono ancora connessi ai dispositivi tty, quindi non influisce sul buffering. Entrambi i riquadri possono anche essere fatti scorrere su e giù indipendentemente (usando screen
la modalità di copia).
Se esegui una shell in modo bash
interattivo con quello script, noterai che il prompt verrà visualizzato nella seconda finestra, mentre la shell leggerà ciò che digiti nella prima finestra mentre quelle shell emettono il loro prompt su stderr.
Nel caso di bash
, l' eco di ciò che digiti apparirà anche nella seconda finestra poiché quell'eco viene emesso dalla shell (readline nel caso di bash
) anche su stderr. Con alcune shell simili ksh93
, verrà mostrata nella prima finestra ( output dell'eco dal driver del dispositivo terminale, non dalla shell), a meno che non si inserisca la shell emacs
o la vi
modalità con set -o emacs
o set -o vi
.