Você pode usar o recurso de divisão vertical do GNU screen
:
#! /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"
Para usar por exemplo como:
that-script 'ls / /not-here'
A idéia é que ele execute a tela com um arquivo conf temporário que inicia duas janelas de tela em um layout dividido vertical. No primeiro, rodamos o seu comando com o stderr conectado ao segundo.
Usamos um pipe nomeado para a segunda janela para comunicar seu dispositivo tty ao primeiro, e também para o primeiro para informar o segundo quando o comando é feito.
A outra vantagem em comparação com as abordagens baseadas em pipe é que a stdout e stderr do comando ainda estão conectadas a dispositivos tty, portanto, isso não afeta o armazenamento em buffer. Ambos os painéis também podem ser rolados para cima e para baixo independentemente (usando o modo de cópia de screen
).
Se você executar um shell como bash
interativamente com esse script, notará que o prompt será exibido na segunda janela, enquanto o shell lerá o que você digitar na primeira janela quando esses shells emitirem o prompt. stderr.
No caso de bash
, o echo do que você digita também aparecerá na segunda janela, já que echo é produzido pelo shell (readline no caso de bash
) em stderr também. Com alguns outros shells como ksh93
, ele será mostrado na primeira janela (saída echo pelo driver do dispositivo de terminal, não pelo shell), a menos que você coloque o shell em emacs
ou vi
modo com set -o emacs
ou set -o vi
.