बैश शेल के संबंध में मुझे याद रखने का सबसे अच्छा तरीका यह है कि यह समझने के लिए कि क्या हो रहा है।
यदि आप सभी को यह याद रखना है कि कमांड को सही कैसे किया जाए, तो आप कोशिश कर सकते हैं
program > /results 2> /results
यह अच्छा और स्पष्ट व्हाट्सएप चल रहा है और याद रखना आसान है। अर्थात
1 STDOUT जा रहा है /results
2STDERR भी सीधे जा रहा है/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/resultsSTDOUT के आउटपुट को ओवरराइड करने की शुरुआत में सीधे सम्मिलित करता है ।
नोट: यदि आप >>संलग्न करते थे तो आप शायद इस वाक्य रचना के साथ दूर हो सकते थे।
हालाँकि आपको जो समस्या है उसे ठीक करने के लिए - 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>&1STDERR को कभी भी STDOUT में भेजा जाता है, का विरोध करता है । अगर यह सच था - आपको अभी भी ओवरराइटिंग की समस्या होगी।
अधिक जानकारी के लिए देखें - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null। कुछ समय हालांकि आपको मिश्रण करने की आवश्यकता होती हैstdoutऔरstderrयह देखने के लिए कि वास्तव में क्या चल रहा है - जैसे कि एक जटिल संकलन प्रक्रिया से आउटपुट को एक फ़ाइल पर पुनर्निर्देशित किया जा रहा है। उस स्थिति में, मैं इसे समाप्त करता हूं