2012-02-18 10 views
16

मैं अपनी बैश स्क्रिप्ट में परीक्षण करना चाहता हूं जहां stdout और stderr निर्देशित हैं, या अधिक सटीक, अगर उन्हें रीडायरेक्ट किया गया है।बैश स्क्रिप्ट में टेस्ट स्टडआउट और स्टीडर रीडायरेक्शन

क्या आपको कोई विचार है?

$* बैश चर मुझे यह जानकारी नहीं देते हैं।

if [ -t 1 ] ; then 
    echo stdout is a terminal 
else 
    echo stdout is not a terminal 
fi 

उपयोग -t 0stdin के लिए:

उत्तर

21

आप -t परीक्षण स्विच का उपयोग करने के लिए बताने के लिए अगर आउटपुट स्ट्रीम tty या नहीं कर रहे हैं सक्षम होना चाहिए।

stderr के लिए -t 2 का उपयोग करें।

+0

यह काम करता है जैसा मैं कामना करता हूं! बहुत बहुत धन्यवाद – Sigmun

25

तकनीकी रूप से यह कहने का कोई तरीका नहीं है कि stdin/stdout/stderr "पुनर्निर्देशित" हैं क्योंकि आप नहीं जानते कि आपकी स्क्रिप्ट का आविष्कार क्या है। यदि इसे किसी अन्य खोल से नहीं बुलाया जा रहा है, तो "पुनर्निर्देशन" की कोई अवधारणा नहीं है।

आपको बस इतना करना है कि इन/आउट/ग़लत फ़ाइल डिस्क्रिप्टर किस प्रकार हैं (टर्मिनल, फीफो, पाइप, डिवाइस, फ़ाइल इत्यादि)। आम तौर पर आप यह जानना चाहते हैं कि आपका आउटपुट कुछ उपयोगकर्ता की स्क्रीन पर जा रहा है या फिर यह दूसरी प्रक्रिया में जा रहा है या नहीं। इस मामले में मैट के उत्तर के अनुसार [ -t 1 ] का उपयोग करें।

यदि आप यह जानना चाहते हैं कि आपकी प्रक्रिया को कहां/रीडायरेक्ट किया गया है, तो सिम्लिंक /proc/$$/fd/1 और /proc/$$/fd/2 के लक्ष्यों की जांच करें।

ध्यान दें कि कोई व्यक्ति आपकी प्रक्रिया के आउटपुट को ./myscript.sh > /dev/pts/1234 के साथ एक अलग टर्मिनल से जोड़ सकता है। फिर यह "पुनर्निर्देशित" होगा, लेकिन stdout अभी भी एक टर्मिनल होगा।

उदाहरण:

$ ls -l /proc/$$/fd/1 > results 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/null 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' |cat 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/pts/0 
$ cat results 
lrwx------ 1 je4d je4d 64 2012-02-17 21:09 /proc/2463/fd/1 -> /dev/pts/11 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8302/fd/1 -> /dev/null 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8304/fd/1 -> pipe:[222798] 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8307/fd/1 -> /dev/pts/0 

[ -t 1 ] 1 और उन के 4 के लिए सच हो जाएगा।

+2

यह एक समृद्ध उत्तर है जो मुझे कुछ बाश सामान समझने की अनुमति देता है। धन्यवाद ! – Sigmun

+0

Thx! मैंने एक कमांड लाइन परीक्षण किया, लेकिन यह मेरे आश्चर्य के लिए काम नहीं किया। यह आदेश: '(lsof -p $$; ls -l/proc/$$/fd; [-t 1] || echo -n not \; echo TERM: $$; ps --forest -s $$;) | fd 1 के लिए बिल्ली -' प्रिंट '/ dev/pts/1', लेकिन प्रिंट नहीं' TERM'। तो [टैग: बैश] जानता है कि इसे रीडायरेक्ट किया गया है ('(...) 'उप-[टैग: बैश] में चलाया जाता है), लेकिन $$ अभी भी अभिभावक का पीआईडी ​​है [टैग: बैश]। – TrueY

+0

हाँ, यह सिर्फ $$ करता है, subshells इसे प्रभावित नहीं करते हैं। यही कारण है कि मैंने इसके बजाय bash -c '...' का उपयोग किया। – je4d

संबंधित मुद्दे