Vous pouvez utiliser screen
la fonction de division verticale de 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"
A utiliser par exemple comme:
that-script 'ls / /not-here'
L'idée est qu'il exécute l'écran avec un fichier de configuration temporaire qui démarre deux fenêtres d'écran dans une disposition de fractionnement vertical. Dans le premier, nous exécutons votre commande avec le stderr connecté au second.
Nous utilisons un canal nommé pour la deuxième fenêtre pour communiquer son périphérique tty à la première, et également pour la première pour indiquer au second lorsque la commande est exécutée.
L'autre avantage par rapport aux approches basées sur les tuyaux est que les commandes stdout et stderr de la commande sont toujours connectées aux périphériques tty, donc cela n'affecte pas la mise en mémoire tampon. Les deux volets peuvent également défiler de haut en bas indépendamment (en utilisant screen
le mode de copie de).
Si vous exécutez un shell comme bash
interactivement avec ce script, vous remarquerez que l'invite sera affichée dans la deuxième fenêtre, tandis que le shell lira ce que vous tapez dans la première fenêtre lorsque ces shells afficheront leur invite sur stderr.
Dans le cas de bash
, l' écho de ce que vous tapez apparaîtra également dans la deuxième fenêtre car cet écho est également émis par le shell (readline dans le cas de bash
) sur stderr. Avec quelques autres coquilles aiment ksh93
, il affichera sur la première fenêtre ( écho sortie par le pilote de périphérique terminal, pas la coquille), à moins que vous mettez le shell en emacs
ou en vi
mode avec set -o emacs
ou set -o vi
.