คุณสามารถใช้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'
แนวคิดก็คือมันรันหน้าจอด้วยไฟล์ conf ชั่วคราวที่เริ่มต้นหน้าต่างหน้าจอสองหน้าต่างในเค้าโครงแบบแยกแนวตั้ง ในอันแรกเราเรียกใช้คำสั่งของคุณโดย stderr เชื่อมต่อกับอันที่สอง
เราใช้ไพพ์ที่มีชื่อสำหรับหน้าต่างที่สองเพื่อสื่อสารอุปกรณ์ tty ของมันกับหน้าต่างแรกและสำหรับคนแรกที่จะบอกหนึ่งในหน้าต่างที่สองเมื่อคำสั่งเสร็จสิ้น
ข้อได้เปรียบอื่น ๆ เมื่อเปรียบเทียบกับวิธีการอิงตามไปป์คือ stdout และ stderr ของคำสั่งยังคงเชื่อมต่อกับอุปกรณ์ tty ดังนั้นจึงไม่มีผลต่อการบัฟเฟอร์ บานหน้าต่างทั้งสองยังสามารถเลื่อนขึ้นและลงได้อย่างอิสระ (โดยใช้screen
โหมดการคัดลอก)
หากคุณเรียกใช้เชลล์เช่นbash
โต้ตอบกับสคริปต์นั้นคุณจะสังเกตเห็นพรอมต์จะปรากฏขึ้นในหน้าต่างที่สองในขณะที่เชลล์จะอ่านสิ่งที่คุณพิมพ์ในหน้าต่างแรกเมื่อเชลล์เหล่านั้นส่งเอาต์พุตพร้อมต์บน stderr
ในกรณีของbash
การสะท้อนของสิ่งที่คุณพิมพ์จะปรากฏบนหน้าต่างที่สองเป็นที่ก้องจะออกจากเปลือก (ReadLine ในกรณีของbash
) บน stderr เช่นกัน กับบางส่วนเปลือกหอยอื่น ๆ เช่นksh93
มันจะแสดงบนหน้าต่างแรก ( ก้องเอาท์พุทโดยไดรเวอร์อุปกรณ์ปลายทางไม่เชลล์) เว้นแต่คุณใส่เปลือกในemacs
หรือvi
โหมดที่มีหรือset -o emacs
set -o vi