Você pode usar o screenrecurso de divisão vertical do 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"
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 inicie duas janelas de tela em um layout de divisão vertical. No primeiro, executamos 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 informar o segundo quando o comando for executado.
A outra vantagem comparada às abordagens baseadas em pipe é que o stdout e o stderr do comando ainda estão conectados a dispositivos tty, portanto, isso não afeta o buffer. Os dois painéis também podem ser rolados para cima e para baixo de forma independente (usando screeno modo de cópia).
Se você executar um shell de maneira bashinterativa com esse script, notará que o prompt será exibido na segunda janela, enquanto o shell lerá o que você digita na primeira janela, conforme esses shells emitem seu prompt no stderr.
No caso de bash, o eco do que você digita também aparecerá na segunda janela, pois esse eco é emitido pelo shell (linha de leitura no caso de bash) no stderr também. Com algumas outras conchas gosta ksh93, ele vai mostrar na primeira janela ( eco saída pelo driver de dispositivo terminal, não o shell), a menos que você colocar o shell em emacsou vimodo com set -o emacsou set -o vi.