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"
たとえば次のように使用するには:
that-script 'ls / /not-here'
アイデアは、垂直分割レイアウトで2つの画面ウィンドウを開始する一時的なconfファイルで画面を実行することです。最初のコマンドでは、2番目のコマンドにstderrを接続してコマンドを実行します。
2番目のウィンドウに名前付きパイプを使用して、ttyデバイスを最初のウィンドウに通信し、最初のウィンドウにコマンドが完了したときに2番目のウィンドウを通知します。
パイプベースのアプローチと比較した他の利点は、コマンドのstdoutとstderrがまだttyデバイスに接続されているため、バッファリングに影響しないことです。両方のペインを個別に上下にスクロールすることもできます(screen
のコピーモードを使用)。
bash
そのスクリプトでインタラクティブにシェルを実行すると、2番目のウィンドウにプロンプトが表示され、シェルがstderrにプロンプトを出力するときに最初のウィンドウに入力した内容が読み取られます。
以下の場合にはbash
、エコー、あなたもそのように第二のウィンドウに表示される入力内容のエコー(の場合はreadlineのシェルによって出力されるbash
stderrに)も。以下のようないくつかの他のシェルではksh93
、それは最初のウィンドウ(に表示されますエコーあなたがシェルを入れない限り、ターミナルデバイスドライバではなく、シェルによって出力)emacs
またはvi
でモードset -o emacs
かset -o vi
。