स्वच्छ निकास के लिए गैर-शून्य निकास स्थिति


15

क्या गैर-शून्य निकास कोड वापस करना स्वीकार्य है यदि प्रश्न में कार्यक्रम ठीक से चला? उदाहरण के लिए, मान लें कि मेरे पास एक साधारण प्रोग्राम है जो (केवल) निम्नलिखित कार्य करता है:

कार्यक्रम एन तर्क लेता है। यह min (N, 255) का निकास कोड देता है। ध्यान दें कि कोई भी N प्रोग्राम के लिए मान्य है।

एक अधिक यथार्थवादी कार्यक्रम सफलतापूर्वक अलग-अलग कार्यक्रमों के लिए अलग-अलग कोड लौटा सकता है जो विभिन्न चीजों को दर्शाता है। क्या इन कार्यक्रमों को इसके बजाय एक स्ट्रीम में इस जानकारी को लिखना चाहिए, जैसे कि स्टडआउट?

जवाबों:


24

यह पर्यावरण पर निर्भर करता है, लेकिन मैं कहूंगा कि यह खराब शैली है।

यूनिक्स जैसी प्रणालियों में एक मजबूत सम्मेलन होता है जो 0 से बाहर निकलने की स्थिति सफलता को दर्शाता है, और कोई भी गैर-शून्य निकास स्थिति विफलता को दर्शाता है। कुछ, लेकिन सभी नहीं, कार्यक्रम विभिन्न गैर-शून्य निकास कोड के साथ विभिन्न प्रकार की विफलताओं के बीच अंतर करते हैं; उदाहरण के लिए grepआम तौर पर 0 लौटाता है यदि पैटर्न पाया गया था, 1 अगर यह नहीं था, और 2 (या अधिक) अगर कोई त्रुटि थी जैसे कि एक लापता फ़ाइल।

यह सम्मेलन यूनिक्स के गोले में बहुत कठिन है। उदाहरण के लिए, इन sh, bashऔर अन्य बॉर्न-जैसे गोले, ifस्टेटमेंट 0 एग्जिट स्टेटस को सक्सेस / ट्रू, और नॉन-जीरो एग्जिट स्टेटस को फेल / झूठे मानते हैं:

if your-command
then
    echo ok
else
    echo FAILURE
fi

मेरा मानना ​​है कि एमएस विंडोज के तहत कन्वेंशन समान हैं।

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

इस तरह की जानकारी को वापस करने के लिए एक प्रोग्राम का सामान्य तरीका यह है कि इसे प्रिंट करें stdout:

status = $(your-command)
echo Result is $status

7
+ 1 कन्वेंशन की व्याख्या करने के लिए, यह दृष्टिकोण मेरी अधिकांश शेल स्क्रिप्ट्स को तोड़ देगा जिन्हें मैंने set -eकहीं रखा था ।
बेंजामिन बैनियर

इसी प्रकार grep, diffअंतर मिलने पर रिटर्न 1; और> 1 यदि कोई त्रुटि हुई।
7heo.tk

6

इस बात पर निर्भर करता है कि आपका पर्यावरण क्या उम्मीद करता है।

विकिपीडिया से मेरा पसंदीदा, विकिपीडिया से :

OpenVMS में, सफलता विषम मूल्यों और यहां तक ​​कि मूल्यों द्वारा विफलता का संकेत है। मूल्य उप-क्षेत्रों के साथ एक 32 बिट पूर्णांक है: नियंत्रण बिट्स, सुविधा संख्या, संदेश संख्या और गंभीरता। सफलता (सफलता, सूचनात्मक) और विफलता (चेतावनी, त्रुटि, घातक) के बीच गंभीर मूल्यों को विभाजित किया जाता है।


4

मुझे लगता है कि एक मिसाल है अगर एग्ज़िट कोड सार्थक, प्रासंगिक जानकारी कॉलर को लौटा रहा है और सफलता की परिभाषा वास्तव में द्विआधारी नहीं है। मैं जिस मिसाल के बारे में सोच रहा हूं वह रोबोकॉपी है जो अलग-अलग चीजों के बारे में बताती है कि क्या हुआ

मैं जोड़ूंगा कि हम हमेशा इस वजह से कुछ डिबगिंग समाप्त करते हैं - सबसे अधिक उपयोगिता मान बाहर निकलें कोड 0 == सफलता इसलिए बाहर निकलती है जब रोबोकॉपी 1 वापस आती है क्योंकि यह कॉपी किए गए सामान को शून्य नहीं करता है क्योंकि यह सामान कॉपी नहीं करता था लेकिन ' t या तो कोई त्रुटि मिलती है।


2

सफल रन के लिए 0 नहीं लौटना एक बुरा विचार है, क्योंकि यह आपके प्रोग्राम को चलाने वालों के लिए भ्रम पैदा कर सकता है। क्या होगा अगर कुछ ने आपके प्रोग्राम को अलग-अलग इनपुट के साथ 100+ बार चलाया और जानना चाहा कि कितने असफल या सफलतापूर्वक पूर्ण हुए हैं, एक ही सफलता का मूल्य होने से कई अलग-अलग मानों की तुलना में अंतर स्पॉट करना बहुत आसान हो जाता है।

यदि आपके पास एक प्रोग्राम है जिसमें कई सफल वापसी पथ हैं जो सभी अलग-अलग चीजों का संकेत दे सकते हैं, तो मैं कहूंगा कि यह एक संकेत है जो आपके प्रोग्राम को खराब डिज़ाइन किया गया है।


2

मैं एक ऐसे मामले के बारे में जानता हूं जो मुझे लगता है कि स्वीकार्य है। मुझे एक परीक्षण ढांचे का पता है जो परीक्षण विफलताओं की कुल संख्या के साथ बाहर निकलता है। इसलिए, उदाहरण के लिए, यदि परीक्षण धावक बिना किसी असफल परीक्षण के पूरा करता है तो वह शून्य के साथ बाहर निकलता है। यदि एक परीक्षण विफल हो गया, भले ही परीक्षण धावक खुद को पूरी तरह से भाग गया, तो यह एक के साथ बाहर निकलता है। यदि दो विफल हो जाते हैं तो यह 2 लौटता है, आदि यह 250 तक चला जाता है, जिसका अर्थ है "250 या अधिक परीक्षण विफलता"।

असामान्य निकास को इंगित करने के लिए यह निकास कोड> 250 का उपयोग करता है।

जबकि यह सम्मेलन का उल्लंघन करता है, यह व्यवहार में अच्छी तरह से काम करता है।


3
मुझे नहीं लगता कि यह सम्मेलन का उल्लंघन करता है - यदि कोई त्रुटि नहीं है, तो परीक्षण सफल होता है; कोई भी गैर-शून्य परिणाम कोड विफल परीक्षणों को इंगित करता है।
बेवन

1
यह "0 से अधिक त्रुटियों को इंगित करने के लिए एक त्रुटि स्थिति से बाहर निकल रहा है" और जबकि यह निकास स्थिति के सटीक सामान्य शब्दार्थ का उल्लंघन कर सकता है, यह निश्चित रूप से बड़े का उल्लंघन नहीं करता है "0 ठीक है, 0 से बड़ा कुछ भी एक त्रुटि है" सम्मेलन ।
वैटीन

2

यह वास्तव में निर्भर करता है कि आप कोड के साथ क्या संदेश दे रहे हैं। DB2, उदाहरण के लिए 100 रिटर्न अगर कोई डेटा नहीं मिला है, चेतावनी के लिए विभिन्न अन्य सकारात्मक मान, और त्रुटियों के लिए नकारात्मक मान। ओरेकल कुछ ऐसा ही करता है।

इसलिए, यदि अलग-अलग सफलता वाले राज्य हैं, तो यह अलग-अलग रिटर्न वैल्यू का उपयोग करने के लायक हो सकता है।


2

एक अच्छा उदाहरण: आदमी सा-अपडेट (स्पैमसैसिन)

बाहर निकलें CODES

  • 0 से बाहर निकलने के कोड का अर्थ है कि एक अपडेट उपलब्ध था, और यदि --checkonly निर्दिष्ट नहीं किया गया था तो उसे सफलतापूर्वक डाउनलोड और इंस्टॉल किया गया था।
  • 1 से बाहर निकलने का कोड का मतलब है कि कोई नया अपडेट उपलब्ध नहीं था।
  • 2 का निकास कोड का अर्थ है ...

इस मामले में, निकास 1 केवल एक सूचनात्मक कोड है। हालाँकि, अगर मैंने कोड लिखा होता, तो मैं 1 को नहीं चुनता क्योंकि आमतौर पर यह असफलता होती है।

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