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'
아이디어는 세로 분할 레이아웃으로 두 개의 화면 창을 시작하는 임시 conf 파일로 화면을 실행한다는 것입니다. 첫 번째에서는 stderr이 두 번째에 연결된 상태에서 명령을 실행합니다.
우리는 두 번째 창에 tty 장치를 첫 번째 창에 전달하기 위해 명명 된 파이프를 사용하고 명령이 완료되면 첫 번째 창에 두 번째 창에 알려줍니다.
파이프 기반 접근 방식과 비교할 때의 다른 장점은 명령의 stdout 및 stderr이 여전히 tty 장치에 연결되어있어 버퍼링에 영향을 미치지 않는다는 것입니다. 두 창을 모두 독립적으로 위아래로 스크롤 할 수 있습니다 ( screen
의 복사 모드 사용).
bash
해당 스크립트 와 대화식으로 쉘을 실행 하면 프롬프트가 두 번째 창에 표시되는 반면, 쉘은 첫 번째 창에 입력 한 내용을 읽습니다. 쉘은 stderr에서 프롬프트를 출력합니다.
의 경우 bash
1, 에코 당신은 또한과 두 번째 창에 나타납니다 입력 한 내용의 에코 (의 경우 readline에 쉘에 의해 출력 bash
표준 오류에는)뿐만 아니라. 다른 쉘 등으로 ksh93
, 그것은 첫 번째 창에 (표시됩니다 에코 당신이 쉘을 넣어하지 않는 한, 상기 단말 장치 드라이버에 의해 출력이 아닌 쉘) emacs
또는 vi
와 모드 set -o emacs
나 set -o vi
.