जवाबों:
दुर्भाग्य से, यह धारणा जो 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
।