जवाबों:
दुर्भाग्य से, यह धारणा जो stderrकेवल त्रुटि आउटपुट के लिए उपयोग की जाती है, हमेशा सही नहीं होती है। बल्कि, stderrअक्सर किसी भी और सभी इंटरैक्टिव आउटपुट और डायग्नोस्टिक्स के लिए उपयोग किया जाता है , अर्थात आउटपुट का उपयोगकर्ता के लिए एक इंटरैक्टिव प्रॉम्प्ट 1 में पढ़ना है । wgetऔर ddप्रसिद्ध उदाहरण हैं।
कुछ कमांड गैर-त्रुटि आउटपुट को दबाने के लिए एक ध्वज (जैसे -quietया -silent) प्रदान करेंगे - यह देखने के लिए कि क्या कोई मौजूद है, उनके मैन पेज पढ़ें।
एक और सम्मेलन जो अधिक बार आयोजित होता है वह है निकास कोड : एक प्रोग्राम एक निकास कोड देता है जब वह बाहर निकलता है। आमतौर पर 2 , 0सफलता का संकेत कोड और किसी अन्य निकास कोड से त्रुटि का संकेत मिलता है।
इसके साथ bash, आप $?चर से अंतिम कमांड का निकास कोड प्राप्त कर सकते हैं । में fish, $statusचर का उपयोग करें । आप stderrएक अस्थायी फ़ाइल पर पाइप कर सकते हैं और यदि कोई त्रुटि होती है तो केवल इसे प्रिंट कर सकते हैं। उदाहरण के लिए ( fish):
command 2>/tmp/outputbuffer
if $status
cat /tmp/outputbuffer
rm /tmp/outputbuffer
आप कुछ शॉर्टकट का भी उपयोग कर सकते हैं, यदि आप कमांडों को चेंज नहीं कर रहे हैं:
if command 2>/tmp/outputbuffer
cat /tmp/outputbuffer
rm /tmp/outputbuffer
या:
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
आप stdoutउपयोग करके उसी बफ़र को पाइप भी कर सकते हैं 2>&1 >/tmp/outputbuffer।
(नोट: मुझे वास्तव में नहीं पता है fish, इसलिए मैं इस अवधारणा का पालन कर रहा हूं कि मैं इसके प्रलेखन में क्या पा सकता हूं। वाक्यविन्यास थोड़ा गलत है। इसके अलावा, आप mktempएक अद्वितीय अस्थायी फ़ाइल बनाने के लिए उपयोग कर सकते हैं - इसे चलाएं और रिकॉर्ड करें। एक चर में फ़ाइल नाम।)
यदि आपको एक शेल के बैकग्राउंड में एक ही समय में पूरी तरह से उपयोग करने की आवश्यकता है, तो आप आउटपुट-छुपा को संभालने के लिए स्क्रिप्ट लिखना बंद कर रहे हैं और उस स्क्रिप्ट को मानक तकनीकों के साथ पृष्ठभूमि में चला रहे हैं। ( fish)। बिल्ली, आप निम्नलिखित कार्य की तरह कुछ डाल सकते हैं ~/.config/fish/config.fish:
function run-silent
set temp (mktemp)
if $argv 2>&1 >$temp
cat $temp
rm $temp
end
कॉल करें run-silent somecommand &(जहाँ अनुगामी &पृष्ठभूमि में चलने का कारण बनता है)
ध्यान दें कि यह मूल बाहर निकलें कोड निगल जाएगा, और दोनों डंप हो जाएगा stdoutऔर stderrएक विफलता की स्थिति में। आप इसे आवश्यकतानुसार अनुकूलित कर सकते हैं।
1 वहाँ भी कोई गारंटी नहीं है कि त्रुटि आउटपुट दिखाई नहीं देगा stdout- कुछ प्रोग्राम वहाँ सभी आउटपुट को डंप कर देंगे!
2 दुर्भाग्य से, यह अभी भी हमेशा मामला नहीं है - निकास कोड पूरी तरह से कार्यक्रम द्वारा नियंत्रित किया जाता है, और कुछ गैर-शून्य बिट्स के साथ कुछ सफलता की स्थिति का संकेत देंगे। फिर से, मैनुअल की जाँच करें।
यूनिक्स उपयोगिताओं के लिए सामान्य संदेश भेजते हैं stdout, और त्रुटि संदेश को भेजते हैं stderr, इसलिए यदि हम केवल त्रुटि संदेश देखना चाहते हैं, तो यह दबाने के लिए पर्याप्त होगा stdoutताकि केवल stderrकंसोल को आउटपुट मिले।
जिस तरह से (दोनों में यह करने के लिए bashऔर fish) संलग्न करने के लिए है >/dev/nullआदेश के लिए। यह पाइप कुछ भी नहीं है, लेकिन stderr (आपकी त्रुटि संदेश के साथ) अभी भी कंसोल के माध्यम से आता है।
उदाहरण के लिए:
कमांड echo 1 >/dev/nullकुछ भी प्रिंट नहीं करता है, क्योंकि सामान्य stdoutआउटपुट दबा दिया जाता है, और कुछ भी नहीं लिखा गया था।
कमांड man doesnotexist >/dev/nullएक त्रुटि संदेश प्रिंट करता है, क्योंकि manइसके त्रुटि संदेश को लिखता है stderr।