बैश शेल के संबंध में मुझे याद रखने का सबसे अच्छा तरीका यह है कि यह समझने के लिए कि क्या हो रहा है।
यदि आप सभी को यह याद रखना है कि कमांड को सही कैसे किया जाए, तो आप कोशिश कर सकते हैं
program > /results 2> /results
यह अच्छा और स्पष्ट व्हाट्सएप चल रहा है और याद रखना आसान है। अर्थात
1
STDOUT जा रहा है /results
2
STDERR भी सीधे जा रहा है/results
समस्या यह है कि आप अपेक्षा के अनुरूप काम नहीं करेंगे। निम्नलिखित को धयान मे रखते हुए:
फ़ाइल: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
और कमांड चलाएँ
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
फिर
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
यहाँ क्या हुआ?
मेरी समझ बैश सेटअप है जो फ़ाइल को सीधे STDERR को इंगित करने वाले पुनर्निर्देशन की /tmp/results
वजह से है और इसकी प्रकृति के कारण >
2 चीजें हैं
- सामान्य रूप से एक नई फ़ाइल बनाएं - इस मामले में यह अवसर समाप्त हो गया है, क्योंकि आउटपुट उत्पन्न होने के समय बैश इस दिनचर्या से आगे बढ़ गया है।
- फ़ाइल की शुरुआत में सीधे डालें। और जैसा
>>
नहीं करता है।
तो इस मामले में STDERR, /tmp/results
STDOUT के आउटपुट को ओवरराइड करने की शुरुआत में सीधे सम्मिलित करता है ।
नोट: यदि आप >>
संलग्न करते थे तो आप शायद इस वाक्य रचना के साथ दूर हो सकते थे।
हालाँकि आपको जो समस्या है उसे ठीक करने के लिए - STDERR को रीडायरेक्ट करने के लिए नहीं - सीधे फाइल में, बल्कि STDERR के आउटपुट को STDOUT स्ट्रीम में मर्ज करने के लिए , ताकि आपको टक्कर न मिले।
ऑपरेटर 2>&1
ऑपरेटर का उपयोग करने से यह प्राप्त होता है
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
&
नाम की एक फ़ाइल से अलग करने के बैश में सक्षम बनाता है 1
और 1
फ़ाइल वर्णनकर्ता।
मेरे लिए कथन 2>&1
स्वयं ही बताता है कि वास्तव में क्या हो रहा है - STDERR को STDOUT पर ही पुनर्निर्देशित किया जा रहा है - और केवल /tmp/results
इसलिए समाप्त होता है क्योंकि STDOUT को इंगित किया जाता है (लगभग एक साइड इफेक्ट के रूप में)।
जैसा कि गाइड का दावा करते हैं, जो कि 2>&1
STDERR को कभी भी STDOUT में भेजा जाता है, का विरोध करता है । अगर यह सच था - आपको अभी भी ओवरराइटिंग की समस्या होगी।
अधिक जानकारी के लिए देखें - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
। कुछ समय हालांकि आपको मिश्रण करने की आवश्यकता होती हैstdout
औरstderr
यह देखने के लिए कि वास्तव में क्या चल रहा है - जैसे कि एक जटिल संकलन प्रक्रिया से आउटपुट को एक फ़ाइल पर पुनर्निर्देशित किया जा रहा है। उस स्थिति में, मैं इसे समाप्त करता हूं