बिना आउटपुट के बैकग्राउंड में कमांड कैसे चलाते हैं जब तक कोई त्रुटि न हो?
यदि आप एक व्यस्त व्यक्ति हैं, तो आखिरी चीज जो आपको चाहिए वह है कि बड़ी मात्रा में 'बेकार' सूचनाओं से परेशान होना, तो आप चीजों को कैसे शांत करते हैं? आज के सुपरयूजर क्यू एंड ए पोस्ट के पास आउटपुट की मात्रा को कम करने में एक पाठक की मदद करने के लिए कुछ शानदार उत्तर हैं.
आज का प्रश्न और उत्तर सत्र सुपरयूज़र के सौजन्य से आता है-स्टैक एक्सचेंज का एक उपखंड, क्यू एंड ए वेब साइटों का एक समुदाय-संचालित समूह है।.
प्रश्न
सुपरयूज़र रीडर Xster जानना चाहता है कि पृष्ठभूमि में कोई आउटपुट नहीं है जब तक कि कोई त्रुटि न हो:
आप कमांड के आउटपुट को कैसे दबाते हैं, लेकिन अगर कमांड के एग्जिट कोड में कोई त्रुटि है तो इसे दिखाएं?
जब तक कोई त्रुटि न हो, आपको पृष्ठभूमि में बिना आउटपुट के चलने की आज्ञा कैसे मिलती है?
उत्तर
सुपरयूजर योगदानकर्ताओं बॉब और मैक्सिमिलियन ल्यूमिस्टर के पास हमारे लिए जवाब है। पहले अप, बॉब:
दुर्भाग्य से, धारणा है कि stderr केवल त्रुटि के लिए उपयोग किया जाता है आउटपुट हमेशा सही नहीं होता है। बल्कि, stderr अक्सर किसी भी और सभी इंटरैक्टिव आउटपुट और डायग्नोस्टिक्स के लिए उपयोग किया जाता है (यानी उपयोगकर्ता के लिए इंटरएक्टिव प्रॉम्प्ट में पढ़ने का इरादा है).(1) wget तथा dd जाने-माने उदाहरण हैं.
कुछ कमांड एक ध्वज प्रदान करेंगे (यानी. -शांत या -मूक) गैर-त्रुटि आउटपुट को दबाने के लिए। अगर कोई मौजूद है, तो उनके मैन पेज पढ़ें.
एक और सम्मेलन जो अधिक बार आयोजित होता है वह है निकास कोड, जब यह बाहर निकलता है तो एक प्रोग्राम एक निकास कोड देता है। आम तौर पर(2), का एक निकास कोड 0 सफलता इंगित करता है, और किसी भी अन्य निकास कोड एक त्रुटि इंगित करता है.
साथ में दे घुमा के, आप से अंतिम आदेश का निकास कोड प्राप्त कर सकते हैं $? चर। में मछली, उपयोग $ स्थिति चर। आप पाइप कर सकते हैं stderr एक अस्थायी फ़ाइल के लिए और केवल एक त्रुटि होने पर इसे प्रिंट करें। उदाहरण के लिए (मछली):
यदि आप आदेशों का पालन नहीं कर रहे हैं तो आप कुछ शॉर्टकट का भी उपयोग कर सकते हैं:
या:
आप पाइप भी कर सकते हैं stdout उसी बफर का उपयोग करके 2> और 1> / tmp / outputbuffer.
(ध्यान दें: मैं वास्तव में नहीं जानता मछली, इसलिए मैं इस अवधारणा का पालन कर रहा हूं कि मैं इसके प्रलेखन में क्या पा सकता हूं। वाक्यविन्यास थोड़ा गलत हो सकता है। इसके अलावा, आप उपयोग कर सकते हैं mktemp एक अद्वितीय अस्थायी फ़ाइल उत्पन्न करने के लिए। इसे चलाएं और चर में फ़ाइल का नाम रिकॉर्ड करें।)
यदि आपको एक शेल की पृष्ठभूमि में पूरी चीज को चलाने की आवश्यकता है जो आप एक ही समय में इंटरएक्टिव रूप से उपयोग कर रहे हैं, तो आप आउटपुट-छिपाई को संभालने के लिए स्क्रिप्ट लिखना बंद कर रहे हैं और उस स्क्रिप्ट को मानक तकनीकों के साथ पृष्ठभूमि में चला रहे हैं। (मछली)। हेक, आप निम्नलिखित फ़ंक्शन की तरह कुछ डाल सकते हैं ~ / .Config / मछली / config.fish:
के साथ बुलाना भागो-चुप सोचेमांद और (जहां अनुगामी है और इसे पृष्ठभूमि में चलाने का कारण बनता है)
ध्यान दें कि यह मूल निकास कोड को निगल जाएगा, और दोनों को डंप कर देगा stdout तथा stderr असफलता की स्थिति में। आप इसे आवश्यकतानुसार अनुकूलित कर सकते हैं.
(1) इस बात की कोई गारंटी नहीं है कि त्रुटि आउटपुट चालू नहीं होगा stdout, कुछ कार्यक्रम वहाँ सभी आउटपुट डंप करेंगे!
(2) दुर्भाग्य से, यह अभी भी हमेशा मामला नहीं है। निकास कोड पूरी तरह से कार्यक्रम द्वारा नियंत्रित किया जाता है और कुछ गैर-शून्य निकास के साथ कुछ सफलता की स्थिति का संकेत देंगे। फिर से, मैनुअल की जाँच करें.
मैक्सिमिलियन ल्यूमिस्टर के उत्तर का अनुसरण:
यूनिक्स उपयोगिताओं के लिए सामान्य संदेश भेजते हैं stdout, और त्रुटि संदेश stderr, इसलिए यदि हम केवल त्रुटि संदेश देखना चाहते हैं, तो यह दबाने के लिए पर्याप्त होगा stdout इतना ही stderr कंसोल को आउटपुट मिलता है.
ऐसा करने का तरीका (दोनों में) दे घुमा के तथा मछली) को जोड़ना है > / Dev / बातिल कमांड को। यह पाइप stdout कुछ नहीं में, लेकिन stderr (आपकी त्रुटि संदेशों के साथ) अभी भी कंसोल के माध्यम से आता है.
उदाहरण के लिए:
आदेश गूंज 1> / देव / अशक्त प्रिंट कुछ भी नहीं है, क्योंकि सामान्य है stdout आउटपुट दबा हुआ है, और कुछ भी नहीं लिखा गया था stderr.
आदेश आदमी doesnotexist> / देव / अशक्त एक त्रुटि संदेश प्रिंट करता है, क्योंकि आदमी इसके लिए त्रुटि संदेश लिखता है stderr.
स्पष्टीकरण में कुछ जोड़ना है? टिप्पणियों में विचार व्यक्त करो। अन्य टेक-सेवी स्टैक एक्सचेंज उपयोगकर्ताओं से अधिक उत्तर पढ़ना चाहते हैं? पूरी चर्चा धागा यहाँ देखें.