कमांड-लाइन एप्लिकेशन में मानक त्रुटि स्ट्रीम का उपयोग कब करें?


9

क्या कमांड-लाइन एप्लिकेशन लिखते समय त्रुटि का उपयोग करने के लिए एक दिशानिर्देश है? मेरे आश्चर्य करने के लिए, मुझे कुछ भी नहीं मिला जब इसे googling।

विशेष रूप से, इस सवाल से मैं अभी चिंतित हूं कि क्या उपयोग करना है stdoutया stderrजब उपयोगकर्ता ने प्रोग्राम को गैरकानूनी तर्कों के साथ बुलाया है। हालांकि, एक अधिक व्यापक जवाब की बहुत सराहना की जाती है क्योंकि यह निश्चित रूप से एकमात्र ऐसा मामला नहीं होगा जिसमें एक स्पष्ट नियम को एक प्रोग्राम लिखने की आवश्यकता होती है जो उपयोगकर्ता द्वारा अपेक्षित तरीके से व्यवहार करता है।


क्या उन आउटपुट संदेशों को नियमित आउटपुट के साथ मिलाया जाना ठीक है? कार्यक्रम डेटा के लिए एक फिल्टर है?
thrig

यह डेटा के लिए फ़िल्टर नहीं है। यह इंटरएक्टिव भी नहीं है। उपयोगकर्ता इसे तर्कों के साथ कहता है (जिनके बीच फ़ाइल पथ हैं), प्रोग्राम काम करता है, उन फ़ाइलों को बदलता है, कुछ संदेशों को प्रिंट करता है, आदर्श रूप से किसी भी त्रुटि संदेश को प्रिंट नहीं करता है, और समाप्त हो जाता है।
UTF-8

जवाबों:


15

हां, stderrगलत तर्कों का उपयोग करने पर संदेश प्रदर्शित करें । और अगर वह भी एप्लिकेशन को बाहर निकलने का कारण बनता है, तो गैर-शून्य निकास स्थिति के साथ बाहर निकलें।

आपको नैदानिक ​​संदेशों के लिए या उपयोगकर्ता सहभागिता के लिए मानक त्रुटि स्ट्रीम का उपयोग करना चाहिए । डायग्नोस्टिक संदेशों में त्रुटि संदेश, चेतावनी और अन्य संदेश शामिल होते हैं जो उपयोगिता के आउटपुट का हिस्सा नहीं होते हैं जब यह सही ढंग से काम कर रहा हो ("सही ढंग से" का अर्थ है असाधारण कुछ भी नहीं हो रहा है, जैसे फाइलें नहीं मिल रही हैं, या जो कुछ भी हो सकता है)।

कई गोले (सभी?) प्रदर्शन का संकेत देते हैं, उपयोगकर्ता प्रकार और मेनू आदि क्या है stderrताकि पुनर्निर्देशन stdoutआपको सार्थक तरीके से शेल के साथ बातचीत करने से रोक नहीं पाएगा।

इस विषय पर एक ब्लॉग पोस्ट से निम्नलिखित है :

यह डौग मैकलरॉय का एक उद्धरण है, जो यूनिक्स पाइप के आविष्कारक है, जिसमें बताया गया है कि यह कैसे stderrहुआ। 'v6' 1975 में जारी किए गए मूल यूनिक्स ऑपरेटिंग सिस्टम के विशिष्ट संस्करण के एक संस्करण की बात कर रहा है।

सभी कार्यक्रमों ने मानक आउटपुट पर डायग्नोस्टिक्स को रखा। जब आउटपुट को but le में पुनर्निर्देशित किया गया था, तो यह हमेशा परेशानी का कारण बना था, लेकिन जब उत्पादन को एक असम्पीडित प्रक्रिया में भेजा गया था, तो यह असहनीय हो गया था। फिर भी, मानक-इनपुट-मानक-आउटपुट मॉडल की सादगी का उल्लंघन करने के लिए अनिच्छुक, लोगों ने v6 के माध्यम से इस स्थिति को सहन किया। कुछ ही समय बाद डेनिस रिची ने मानक त्रुटि। ले की शुरुआत करके गॉर्डियन गाँठ को काट दिया। यह काफी नहीं था। पाइपलाइनों के साथ निदान एक साथ चलने वाले कई कार्यक्रमों में से किसी से भी हो सकता है। खुद की पहचान के लिए डायग्नोस्टिक्स की जरूरत है।
- डौग मैकलरॉय, "ए रिसर्च यूनिक्स रीडर: प्रोग्रामर मैनुअल, 1971-1986 से एनोटेट अंश।"

"अपने आप को पहचानने" का अर्थ है "अरे! यह मेरी बात है! यह गलत हो गया: [...]"

$ ls nothere
ls: nothere: No such file or directory

ऐसा करना stderrबेहतर होता है, क्योंकि यह अन्यथा जो कुछ भी पढ़ रहा था, उसके द्वारा पढ़ा जा सकता है stdout(लेकिन हम lsवैसे भी ऐसा नहीं करते , हम करते हैं?)।


इसलिए जब आप उपयोगकर्ता से कुछ पूछ रहे हैं जैसा कि एप्लिकेशन चल रहा है, तो आपको स्टैडर पर प्रश्न प्रिंट करना चाहिए? यह सही नहीं लगता। क्या आपके पास इसके लिए एक स्रोत है? क्या यह केवल उन अनुप्रयोगों पर लागू होता है जिनके पास केवल प्रश्नों और प्रतिक्रियाओं के अलावा आउटपुट होते हैं (आउटपुट उपयोगकर्ता को कहीं पाइप करना चाहते हैं)?
UTF-8

@ यूटीएफ -8 प्रश्न के पाठ को कार्यक्रम के आउटपुट का हिस्सा माना जाना चाहिए? उस बारे में क्या जो उपयोगकर्ता में टाइप करता है? मुझे नहीं लगता कि यह होना चाहिए (जैसे गोले नहीं लगता कि ऐसा होना चाहिए)। लेकिन शायद यह आवेदन पर निर्भर करता है?
Kusalananda

1
आपके संपादन के लिए धन्यवाद। इस बीच, मैंने मानक अनुप्रयोगों के व्यवहार की जाँच की और वे ऐसे व्यवहार करते हैं जैसे कोई आपके उत्तर को पढ़ने के बाद उनसे व्यवहार करने की अपेक्षा करेगा।
UTF-8

@ UTF-8 आप इस क्यू एंड ए प्रासंगिक हो सकते हैं: unix.stackexchange.com/q/331611/22222
terdon

6

मानक धाराओं के लिए POSIX विशिष्टताओं से :

प्रोग्राम स्टार्ट-अप में, तीन धाराओं को पूर्वनिर्धारित किया जाएगा और स्पष्ट रूप से खोलने की आवश्यकता नहीं है: मानक इनपुट (पारंपरिक इनपुट पढ़ने के लिए), मानक आउटपुट (पारंपरिक आउटपुट लिखने के लिए), और मानक त्रुटि (नैदानिक ​​आउटपुट लिखने के लिए )।

दूसरे शब्दों में, त्रुटियां, डिबगिंग जानकारी और डायग्नोस्टिक श्रेणी में आने वाली किसी भी चीज़ में चला जाता है stderr

अधिक जानकारी के लिए संबंधित प्रश्न देखें: क्या प्रगति रिपोर्ट / लॉगिंग जानकारी stderr या stdout पर है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.