मतलब एग्जिट 0, एग्जिट 1 और एग्जिट 2 एक बैश स्क्रिप्ट में


49

मैं कुछ अभ्यास अभ्यास कर रहा हूं।

एक स्क्रिप्ट लिखें जिसे तर्क के रूप में एक महीने की संख्या दी जाएगी और इस नंबर को एक महीने के नाम में अनुवाद किया जाएगा। परिणाम को प्रिंटआउट में प्रिंट किया जाएगा।

मैंने एक हल बनाया:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

क्या करते हैं exit 1, exit 0और क्या exit 2मतलब है, और हम उनका उपयोग क्यों करते हैं?


5
एक सफलतापूर्वक निष्पादित कोड कोड 0 से बाहर निकलना चाहिए। अन्य मान एक त्रुटि का संकेत देते हैं। उदाहरण के लिए देखें विशेष अर्थ के साथ एग्जिट कोड
वी। ऑलसेन

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

5
यदि यह आपके द्वारा लिखा गया कोड है, तो आप कैसे आए हैं, ऐसे बयानों का उपयोग करें जिन्हें आप भी नहीं समझते हैं?
दिमित्री ग्रिगोरीव

5
1) आपने प्रश्न पोस्ट करने के ठीक बाद एक उत्तर स्वीकार किया । इससे भी बेहतर जवाब के लिए 24 घंटे का समय दें। 2) स्वीकृत उत्तर गलत और भ्रामक है। सही उत्तर "निकास कोड (0 = सफलता से परे) के लिए कोई डिफ़ॉल्ट अर्थ नहीं है; आप स्क्रिप्ट डेवलपर के रूप में शब्दार्थ को परिभाषित करते हैं"। 3) यदि आपने वह स्क्रिप्ट बनाई है, तो आपने एग्जिट कमांड क्यों जोड़े (ये सभी तार्किक रूप से बहुत कम हैं या आप "एग्जिट 1" में ढल सकते हैं क्योंकि आप अगर-और वैसे भी उपयोग करते हैं)।
AoE

जवाबों:


58

शेल निकास कोड के लिए यहां एक अच्छा संदर्भ दिया गया है :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

कैविएट: उचित निकास कोड का उपयोग करना एक आवश्यकता नहीं है और इसे शेल द्वारा लागू नहीं किया गया है। यदि वे इसे बुद्धिमान समझते हैं तो डेवलपर्स मार्गदर्शन की उपेक्षा कर सकते हैं।


8
हालांकि सावधान रहें। एक्ज़िट कोड का मतलब पूरी तरह से प्रोग्राम के डेवलपर्स से है।
मुरु

इसके अलावा, जबकि जुड़े स्रोत, एडवांस्ड बैश स्क्रिप्टिंग गाइड, " आरक्षित निकास कोड" (मूल में जोर) को दिखाने का दावा करता है, यह दावा दोनों एकजुट और पूरी तरह से गलत है
एलिया कगन

23

exitसंख्या और संख्या का उपयोग करना आपकी स्क्रिप्ट के परिणाम को इंगित करने का एक आसान तरीका है। यह उस तरह की नकल करता है जो बाश कमांड आउटपुट को रिटर्न कोड देता है। बैश के साथ रिटर्न कोड 0 का आमतौर पर मतलब है कि त्रुटियों के बिना सफलतापूर्वक निष्पादित सभी कुछ। exitउस बिंदु पर आपकी स्क्रिप्ट का निष्पादन भी रोक देता है और कमांड लाइन पर वापस आ जाता है।

0 से अधिक कोई भी रिटर्न कोड किसी प्रकार की त्रुटि को इंगित करता है, हालांकि कभी-कभी त्रुटि महत्वपूर्ण नहीं होती है, प्रत्येक कमांड के लिए यह संभव है कि वह कुछ दस्तावेज ढूंढे जो आपको बताए कि प्रत्येक रिटर्न कोड का क्या अर्थ है।

आप शेल वैरिएबल का उपयोग करके अंतिम बैश कमांड का रिटर्न कोड प्राप्त कर सकते हैं $?:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

जब आप इसे स्क्रिप्ट में उपयोग करते हैं, तो आप उसी तरह से रिटर्न कोड को क्वेरी कर सकते हैं जब इसे निष्पादित किया जाता है। तो आप देखेंगे कि:

exit 2
exit 0

व्यर्थ की तरह है, जैसा कि आप कभी भी exit 0भाग तक नहीं पहुंच सकते ।


3

सभी अपने आप में, exitशून्य से बाहर निकलने के मूल्य या आपकी स्क्रिप्ट के सफल समापन का अर्थ है। सफल समापन को इंगित करने के लिए आपको निकास तर्क में शून्य तर्क जोड़ने की आवश्यकता नहीं है। आपकी स्क्रिप्ट सफलतापूर्वक (या शायद) सफलतापूर्वक निकल जाएगी हालांकि यह एक गलत स्थिति के लिए परीक्षण करता है। इस स्थिति में आप विशेष रूप से चाहते हैं कि यह त्रुटि (या 1) की स्थिति से बाहर निकले।

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

exitअंतिम पंक्ति में आदेश सभी पर वहाँ होना जरूरी नहीं है। इसे शून्य के साथ बुलाया जा सकता है या बिल्कुल नहीं बुलाया जा सकता है। बाहर निकलने के 1 तर्क को निर्दिष्ट किए बिना इन सभी मामलों में उत्तर echo $?शून्य होगा।

हालाँकि बाहर निकलने के आदेश के लिए 1 तर्क को निर्दिष्ट करने की प्रतिक्रिया echo $?1 होगी। इसलिए जब आप यह निर्दिष्ट करना चाहते हैं कि त्रुटि स्थिति के साथ बाहर निकल गए हैं तो निकास तर्क के लिए 1 तर्क का उपयोग करें।

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