यदि कमांड या शेल स्क्रिप्ट का आउटपुट stdout या stderr है तो कैसे बताएं


32

हम कहते हैं कि मैं एक कमांड या शेल स्क्रिप्ट चलाता हूं, और यह मुझे आउटपुट देता है। इस कमांड या शेल स्क्रिप्ट के इंटर्नल को जाने बिना, यह कैसे निर्धारित किया जाता है कि आउटपुट से था stderrया stdout?

उदाहरण के लिए,

$ ls -ld /
drwxrwxr-t  35 root  admin  1258 Dec 11 19:16 /

बनाम

ls -ld /test
ls: /test: No such file or directory

मैं यह कैसे पता लगाऊंगा कि पहली कमांड किसने छापी थी stdoutऔर दूसरी stderrने (इसे किया था?)।


1
आप यहां क्या समस्या हल करने की कोशिश कर रहे हैं?
केनस्टर

3
डरता था कि कोई पूछ लेगा कि; वास्तव में कोई नहीं, ज्यादातर उत्सुक और पुनर्निर्देशन की मेरी समझ में सुधार की उम्मीद कर रहा है।
के.एम.

7
आप stderredअपने शेल पर्यावरण LD_PRELOADमें पाने के लिए stdoutऔर stderrविभिन्न रंगों में रख सकते हैं। यहाँ उस नस में एक संबंधित प्रश्न है।
एको

जवाबों:


18

एक बार यह बताने का कोई तरीका नहीं है कि आउटपुट पहले ही प्रिंट हो चुका है। इस मामले में, दोनों stdoutऔर stderr, टर्मिनल से जुड़े हैं जानकारी के बारे में जो धारा के लिए पहले से ही समय पाठ अपने टर्मिनल पर दिखाई दिया गायब हो गयी लिखा गया था तो; टर्मिनल पर बनाने से पहले वे कार्यक्रम द्वारा संयुक्त थे।

आप क्या कर सकते हैं, उपरोक्त मामले में, कमांड को चलाने के लिए होगा stdoutऔर stderrविभिन्न स्थानों पर पुनर्निर्देशित किया जाएगा और देखें कि क्या होता है। या इसे दो बार चलाएं, एक बार stdoutरीडायरेक्ट करने के साथ /dev/nullऔर एक बार stderrरीडायरेक्ट करने के साथ /dev/null, और देखें कि उन मामलों में से कौन सा परिणाम पाठ दिखा रहा है।

आप अनुप्रेषित कर सकते हैं stdoutकरने के लिए /dev/nullटैकिंग द्वारा >/dev/nullआदेश पंक्ति के अंत पर है, और आप अनुप्रेषित कर सकते हैं stderrकरने के लिए /dev/nullजोड़कर 2>/dev/null


9

आप का उपयोग करके stdout पुनर्निर्देशित कर सकते हैं > file, और stderr पुनर्निर्देशन का उपयोग कर 2> file। कई आधुनिक गोले आज्ञाओं को पुनर्निर्देशित करने का समर्थन करते हैं, इसलिए आप यह sedउजागर करने के लिए उपयोग कर सकते हैं कि कौन सी धारा किस धारा से आती है:

$ ls 2> >(sed 's/^/2: /') > >(sed 's/^/1: /')
1: unity_support_test.0
1: vmwareDnD

$ ls foo 2> >(sed 's/^/2: /') > >(sed 's/^/1: /')
2: ls: cannot access foo: No such file or directory

बहुत अच्छा! यह बहुत अच्छा होगा यदि कोई उपसर्ग के बजाय रंगों में रेखाओं को उजागर कर सके।
डॉटनचेन

3
@dotancohen: एक कर सकते हैं! जैसे,(echo "this is stdout"; echo "this is stderr" >&2) > >(sed 's/.*/\x1b[32m&\x1b[0m/') 2> >(sed 's/.*/\x1b[31m&\x1b[0m/')
PM 2Ring

ध्यान दें कि यदि stdout और stderr से मिश्रित आउटपुट है, तो पहले stdout मुद्रित किया जाएगा, फिर stderr।
nyuszika7h

5

annotate-outputडेबियन से स्क्रिप्ट devscriptsआप इस चुनिंदा करने देता है:

$ annotate-output ls -ld /test
14:54:22 -: Started ls -ld /test
14:54:22 E: ls: cannot access /test: No such file or directory
14:54:22 -: Finished with exitcode 2

दूसरा स्तंभ क्रमशः Oऔर Eक्रमशः स्टडआउट और स्टडर को इंगित करता है।

कुछ जवाब हैं, मुख्य एक के रूप में अन्य जवाब में कहा जा रहा है: आप इस तथ्य के बाद ऐसा नहीं कर सकते। न तो शेल और न ही टर्मिनल को इस बात की जानकारी है कि एक मनमाना कार्यक्रम अपने फाइल डिस्क्रिप्टर का उपयोग कैसे करता है, हालांकि शेल शुरू में उन्हें स्थापित करने के लिए जिम्मेदार है।

इस विधि में डेटो का उपयोग किया जाता है, डेटो के लिए लिखना एक ट्टी को लिखने की तुलना में अलग तरह से व्यवहार कर सकता है, और दो अलग-अलग पोजों को लिखना निश्चित रूप से अलग होता है (संभावित समय / इंटरलेविंग मुद्दे)। इसके अलावा, यह इंटरएक्टिव उपयोग के लिए उपयुक्त नहीं है, उदाहरण के annotate-output bashलिए एक महान योजना नहीं है, लेकिन यह कई अन्य उद्देश्यों के लिए उपयोगी है। स्टनिंग / स्टडआउट / स्टडर के बारे में संबंधित प्रश्नों के उत्तर में स्क्रिप्ट और शेल फ़ंक्शन के कई उदाहरण हैं, सबसे मजबूत स्टैडर है जो स्टडर को लिखे गए डेटा को संशोधित करने के लिए (अधिकांश) रनटाइम संशोधन का उपयोग करता है।

यह प्रश्न कि Anko उस संबंधित विषय पर अच्छे उत्तर देने के लिए लिंक करता है: stdout / stderr आउटपुट को रंगीन करना: क्या मैं अपने शेल को STDERR और STDOUT को अलग-अलग रंगों में प्रिंट करने के लिए कॉन्फ़िगर कर सकता हूं?


1
ध्यान दें कि यह लूप bashका उपयोग करने वाली एक स्क्रिप्ट while readहै और dateस्टडआउट या स्टेडर की प्रत्येक पंक्ति के लिए एक कमांड चला रहा है , इसलिए यह cmd > >(ts '%T O:') 2> >(ts '%T E:')समकक्ष की तुलना में बहुत कम कुशल होने जा रहा है ।
स्टीफन चेजलस

1

अन्य उत्तरों के अलावा, यह इंगित करने के लिए निरंतर है /proc/$PID/fd(हालांकि यह प्रश्न का उत्तर नहीं देता है):

$ cat > /dev/null 2> /tmp/blablah &
[1] 3073

[1]+  Stopped                 cat > /dev/null 2> /tmp/blablah
$ ls -l /proc/3073/fd
total 0
lrwx------ 1 kampde kampde 64 Feb 24 11:43 0 -> /dev/pts/33
l-wx------ 1 kampde kampde 64 Feb 24 11:43 1 -> /dev/null
l-wx------ 1 kampde kampde 64 Feb 24 11:43 2 -> /tmp/blablah

जैसा कि आप देखते हैं, यहां आप एक प्रक्रिया के लिए खोले गए फ़ाइल विवरण देख सकते हैं। 0है STDIN, 1है STDOUTऔर 2है STDERR। यदि आपके पास STDOUT या STDERR पुनर्निर्देशित नहीं है, तो आप देखेंगे /dev/pts/33(इस उदाहरण में कम से कम) क्योंकि वे टर्मिनल को इंगित करेंगे।

नोट : /proc/$PIDकेवल चल रही प्रक्रियाओं के लिए मौजूद है। इस मामले में मैंने catबिना तर्कों का उपयोग किया है, इसलिए जब तक मैं बंद नहीं करता हूं, यह समाप्त नहीं होता है STDIN। मैंने इसे पृष्ठभूमि में भी निष्पादित किया है इसलिए मेरे पास इस उदाहरण के लिए तुरंत पीआईडी ​​है।


0

यह बिल्कुल स्पष्ट नहीं है कि आप क्या पूछ रहे हैं लेकिन यह मदद कर सकता है

ls -ld /
echo $?    # Exit status 0 returned because command executed successfully.

ls -ld /test
echo $?    # Non-zero exit status returned -- command failed to execute

स्रोत

यदि बाहर निकलने का कोड 0 है, तो इसका सीधा मतलब है कि कमांड सही तरीके से निष्पादित (stdout) है, यहां आप अर्थ पा सकते हैं यदि निकास कोड 0 (stderr) से भिन्न है


बहुत ही रोचक! मैंने कभी भी बाहर निकलने की स्थिति को पुनर्निर्देशन से नहीं जोड़ा होगा। क्या शून्य का अर्थ है stdoutऔर गैर का शून्य का अर्थ है stderr?
के.एम.

7
@ केएम।, नहीं। मैं कहूंगा कि यह दृढ़ता से सहसंबंधित है, लेकिन ऐसा कुछ भी नहीं है जो एक प्रोग्राम को लिखने stderrऔर एक अच्छे त्रुटि कोड को stdoutवापस करने या एक खराब त्रुटि कोड को लिखने और वापस करने से रोकता है । वास्तव में, कोशिश करें find /root- यह मानते हुए कि आप रूट के रूप में नहीं चल रहे हैं, आपको 2 लाइनें प्रिंट आउट मिलनी चाहिए - "/ रूट" प्रिंट हो जाता है stdout, और "ढूंढें: / रूट: अनुमति अस्वीकृत" मुद्रित हो जाता है stderr। और रिटर्न एक बुरा रिटर्न कोड पाते हैं।
गॉडलीजेक

सेशन की समस्या स्पष्ट है कि कैसे बताया जाए कि स्टडआउट या स्टडर है।
it_is_a_literature

0

आमतौर पर एसटीडीआरआर में एक कोलोन के साथ संदेश के लिए प्रोग्राम का नाम होगा।

उदाहरण:

rpm -zq some_utils 
rpm: -zq: unknown option

बनाम

rpm -ql some_utils 
package some_utils is not installed

-1

त्रुटि आउटपुट के लिए कैप्चर और परीक्षण करने के लिए:

ls -l test 2>errors
if [ -s errors ]; then echo "There were errors:" && cat errors; fi
rm errors
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.