Вы можете использовать screenфункцию вертикального разделения 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"
Использовать, например, как:
that-script 'ls / /not-here'
Идея состоит в том, что он запускает экран с временным файлом конфигурации, который запускает два окна экрана в вертикальной раскладке. В первом случае мы запускаем вашу команду с подключенным stderr ко второму.
Мы используем именованный канал для второго окна, чтобы сообщить свое tty-устройство первому, а также для первого, чтобы сообщить второму, когда команда выполнена.
Другое преимущество по сравнению с конвейерным подходом состоит в том, что команды stdout и stderr по-прежнему подключены к tty-устройствам, поэтому это не влияет на буферизацию. Обе панели также можно прокручивать вверх и вниз независимо (в screenрежиме копирования).
Если вы запустите оболочку в bashинтерактивном режиме с этим сценарием, вы заметите, что подсказка будет отображаться во втором окне, а оболочка будет читать то, что вы вводите в первом окне, когда эти оболочки выводят свою подсказку на stderr.
В случае bash, эхо того, что вы вводите, также появится во втором окне, так как это эхо выводится оболочкой (readline в случае bash) также на stderr. С некоторыми другими оболочками, такими как ksh93, он будет отображаться в первом окне ( вывод эха драйвером оконечного устройства, а не оболочкой), если вы не включили оболочку emacsили viрежим с помощью set -o emacsили set -o vi.