आप 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'
विचार यह है कि यह एक अस्थायी गोपनीय फ़ाइल के साथ स्क्रीन चलाता है जो एक ऊर्ध्वाधर विभाजन लेआउट में दो स्क्रीन खिड़कियां शुरू करता है। पहले एक में, हम दूसरे के साथ जुड़े हुए stderr के साथ आपकी कमांड चलाते हैं।
हम दूसरी विंडो के लिए एक नामित पाइप का उपयोग उसके पहले डिवाइस को संप्रेषित करने के लिए करते हैं, और दूसरे के लिए यह भी कहते हैं कि जब कमांड किया जाता है तो पहले वाले के लिए।
पाइप-आधारित दृष्टिकोणों की तुलना में अन्य लाभ यह है कि कमांड के stdout और stderr अभी भी tty उपकरणों से जुड़े हुए हैं, इसलिए यह बफरिंग को प्रभावित नहीं करता है। दोनों पैन को स्वतंत्र रूप से ऊपर और नीचे स्क्रॉल किया जा सकता है ( screen
कॉपी कॉपी मोड का उपयोग करके )।
यदि आप bash
उस स्क्रिप्ट के साथ अंतःक्रियात्मक रूप से एक शेल चलाते हैं , तो आप देखेंगे कि प्रॉम्प्ट दूसरी विंडो पर प्रदर्शित किया जाएगा, जबकि शेल पढ़ेगा कि आप पहली विंडो में क्या टाइप करते हैं क्योंकि शेल उन स्टेटर पर अपने प्रॉम्प्ट को आउटपुट करते हैं।
के मामले में bash
, आप जो टाइप करते हैं उसकी प्रतिध्वनि दूसरी खिड़की पर भी दिखाई देगी क्योंकि उस प्रतिध्वनि का उत्पादन शेल पर होता है (साथ ही स्टैडर bash
पर) के मामले में भी। कुछ अन्य गोले की तरह के साथ ksh93
, यह पहली खिड़की पर (दिखाएगा गूंज , टर्मिनल डिवाइस ड्राइवर द्वारा उत्पादन, खोल नहीं) जब तक आप में खोल रखा emacs
या vi
साथ मोड set -o emacs
या set -o vi
।