Puede usar screen
la función de división vertical 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"
Para usar por ejemplo como:
that-script 'ls / /not-here'
La idea es que ejecuta la pantalla con un archivo de configuración temporal que inicia dos ventanas de pantalla en un diseño dividido vertical. En el primero, ejecutamos su comando con el stderr conectado al segundo.
Usamos una tubería con nombre para la segunda ventana para comunicar su dispositivo tty a la primera, y también para que la primera le diga a la segunda cuando se complete el comando.
La otra ventaja en comparación con los enfoques basados en tuberías es que stdout y stderr del comando todavía están conectados a dispositivos tty, por lo que no afecta el almacenamiento en búfer. Ambos paneles también se pueden desplazar hacia arriba y hacia abajo de forma independiente (utilizando screen
el modo de copia).
Si ejecuta un shell de forma bash
interactiva con ese script, notará que el indicador se mostrará en la segunda ventana, mientras que el shell leerá lo que escriba en la primera ventana a medida que esos shells muestren su indicador en stderr.
En el caso de bash
, el eco de lo que escribe también aparecerá en la segunda ventana a medida que ese eco es emitido por el shell (readline en el caso de bash
) también en stderr. Con algunas otras conchas les gusta ksh93
, se mostrará en la primera ventana ( eco de salida por el controlador de dispositivo de terminal, no la cáscara), a menos que poner la cáscara en emacs
o vi
modo con set -o emacs
o set -o vi
.