GNU'nun screen
dikey bölme özelliğini kullanabilirsiniz:
#! /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"
Örneğin şu şekilde kullanmak için:
that-script 'ls / /not-here'
Fikir, ekranı dikey bölünmüş düzende iki ekran penceresi başlatan geçici bir conf dosyasıyla çalıştırmasıdır. İlkinde, komutunuzu stderr ikincisine bağlıyken çalıştırırız.
İkinci pencere için tty cihazını birincisine iletmek için adlandırılmış bir boru kullanırız ve ilk olarak komutun tamamlandığını ikincisine bildiririz.
Boru tabanlı yaklaşımlarla karşılaştırıldığında diğer avantaj, komutun stdout ve stderr'inin hala tty cihazlarına bağlı olmasıdır, bu nedenle arabelleğe almayı etkilemez. Her iki bölme de bağımsız olarak yukarı ve aşağı kaydırılabilir ( screen
'kopyalama modu' kullanılarak ).
Bu bash
komut dosyasıyla etkileşimli gibi bir kabuk çalıştırırsanız , komut isteminin ikinci pencerede görüntüleneceğini fark edersiniz, kabuk ise ilk pencerede yazdıklarınızı okuyacak ve bu kabuklar stderr'de istemlerini çıkarır.
Durumunda bash
, yankı Ayrıca ikinci pencerede görünecektir yazdıklarınıza ait eko (durumunda taleb kabuk tarafından çıkışı bash
, standart hataya) de. Başka bir kabukları gibi ile ksh93
, ilk pencere (gösterir yankı sen kabuk koymak sürece, terminal cihazı sürücüsü tarafından çıkış değil, kabuk) emacs
ya da vi
mod set -o emacs
veya set -o vi
.