बैश स्क्रिप्ट के अंत में बाहर निकलें कोड


22

मैं बैश स्क्रिप्ट के अंत में निकास कोड के अर्थ के बारे में उलझन में हूं: मुझे पता है कि निकास कोड 0 का मतलब है कि यह सफलतापूर्वक समाप्त हो गया है, और यह कि कई और निकास कोड संख्याएं हैं (127 यदि मैं गलत नहीं हूं?)

मेरा प्रश्न इस बारे में है कि किसी स्क्रिप्ट के अंत में एग्ज़िट कोड 0 देखते समय, क्या यह एग्ज़िट कोड को 0 के रूप में लागू करता है, भले ही स्क्रिप्ट विफल हो या इसका कोई और अर्थ हो?


2
यदि कोई स्क्रिप्ट समाप्त होती है exit 0, तो यह स्क्रिप्ट के भीतर क्या होता है, इसकी परवाह किए बिना 0 के निकास कोड के साथ बाहर निकल जाएगा।
हैटलॉक

@Hatclock आपने अपना उत्तर पूर्ण प्रतिसाद क्यों नहीं दिया? एक टिप्पणी के रूप में मैं इसे चिह्नित नहीं कर सकता, और मुझे नहीं लगता कि आपको उत्तर देने के लिए नकली इंटरनेट पॉइंट मिलते हैं (सही?) बस एक विचार ... (तेजी से उत्तर देने के लिए यश)
बस्टेड

1
मैं अपने फोन पर एक ट्रेन स्टेशन पर हूं, मुझे वास्तव में अपने फोन पर बहुत ज्यादा लिखना पसंद नहीं है। ilkkachu एक अच्छा जवाब है, हालांकि लगता है!
हैटलॉक


2
@ हैटलॉक नहीं, बिल्कुल नहीं। यदि कोई स्क्रिप्ट समाप्त होती है exit 0, तो यह कोड 0 के साथ ही बाहर निकलेगा, यदि वह अंतिम निर्देश निष्पादित किया गया हो। exit 0स्क्रिप्ट के अंत में एकमात्र प्रभाव पिछले निर्देश से स्थिति के बजाय 0 वापस करना है।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


22

बिलिन कमांड exitशेल से बाहर निकलता है ( बैश के संदर्भ से ):

exit [n]
शेल से बाहर निकलें, शेल के माता-पिता के लिए n की स्थिति लौटाते हैं। यदि n को छोड़ दिया गया है, तो निकास स्थिति निष्पादित अंतिम कमांड की है। EXIT पर कोई भी जाल शेल समाप्त होने से पहले निष्पादित किया जाता है।

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

बेशक बीच में स्क्रिप्ट को समाप्त करने के लिए आप अक्सर exitअंदर से उपयोग करेंगे if

इन्हें 1 प्रिंट करना चाहिए ( $?पिछले कमांड द्वारा दिया गया एग्ज़िट कोड):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

जबकि यह 0 प्रिंट होना चाहिए:

sh -c "false; exit 0" ; echo $?

मुझे यकीन नहीं है कि अगर स्क्रिप्ट की अवधारणा "विफल" हो जाती exitहै, तो समझ में आता है, क्योंकि स्क्रिप्ट द्वारा विफल करने के लिए चलाए गए कुछ आदेशों के लिए यह काफी संभव है, लेकिन स्क्रिप्ट को सफल होने के लिए। यह स्क्रिप्ट के लेखक पर निर्भर करता है कि वह तय करे कि सफलता क्या है और क्या नहीं।

साथ ही, बाहर निकलने के कोड के लिए मानक सीमा 0..255 है। 127 से ऊपर के कोड शेल द्वारा एक सिग्नल द्वारा समाप्त की गई प्रक्रिया को इंगित करने के लिए उपयोग किए जाते हैं, लेकिन उन्हें सामान्य तरीके से वापस किया जा सकता है। waitसिस्टम कॉल वास्तव में एक व्यापक मान देता है, बाकी युक्त स्थिति बिट्स ऑपरेटिंग सिस्टम द्वारा निर्धारित के साथ।


कूल, मुझे 8 बिट्स के बाहर निकलने के कोड के बारे में पता नहीं था। धन्यवाद!
बस्टेड

ध्यान दें कि जब एक प्रक्रिया को मार दिया जाता है, तो यह एक निकास कोड> 127 के साथ बाहर नहीं निकलता है। यह सिर्फ इतना है कि कुछ गोले $?उस मामले में 128 + साइनम पर सेट होते हैं। प्रक्रिया समाप्त होने पर डिफ़ॉल्ट निकास कोड देखें ? ब्योरा हेतु।
स्टीफन चेज़लस

exit 0यदि निकास निष्पादित किया जाता है, तो केवल 0 वापस आएगा। (यह एक अलग मार्ग से बाहर निकल सकता है)।
बजे ctrl-alt-delor

18

0 का अर्थ है सफलता, सकारात्मक पूर्णांक का अर्थ है असफलता। 255 अलग-अलग त्रुटि कोड हैं, लेकिन 126 और इसके बाद के संस्करण मानों को इंगित करने के लिए आरक्षित हैं कि एक कार्यक्रम शुरू नहीं हो सकता (126 या 127) या एक सिग्नल (129 और ऊपर) द्वारा मारा गया था। प्रक्रिया समाप्त होने पर डिफ़ॉल्ट निकास कोड देखें ? और क्या वापसी / निकास मूल्य मैं बैश फ़ंक्शंस / स्क्रिप्ट में उपयोग कर सकता हूं? अधिक जानकारी के लिए।

शेल स्क्रिप्ट की एक्ज़िट स्थिति अंतिम कमांड की एक्ज़िट स्थिति है जिसे स्क्रिप्ट निष्पादित करती है। इसलिए उदाहरण के लिए

#!/bin/sh
somecommand

की निकास स्थिति देता है somecommand, जबकि

#!/bin/sh
somecommand
exit 0

रिटर्न 0 की परवाह किए बिना जो somecommandलौटा। यह दूसरी पटकथा भी लिखी जा सकती थी

#!/bin/sh
somecommand
true

exit 0एक स्क्रिप्ट के अंत में लाना जरूरी नहीं है कि यह वापस लौटे। 0. यह केवल स्क्रिप्ट के अंत तक पहुंचने पर इसे 0 देता है। उदाहरण के लिए, निम्न स्क्रिप्ट हमेशा 3 देता है:

#!/bin/sh
exit 3
exit 0

सिंटैक्स त्रुटि के बारे में संदेश प्रदर्शित करने के अलावा, निम्न स्क्रिप्ट भी हमेशा एक त्रुटि कोड देता है:

#!/bin/sh
}
exit 0

निम्नलिखित स्क्रिप्ट अपने पहले तर्क के आधार पर 1 या 0 रिटर्न करती है:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

निम्न स्क्रिप्ट की स्थिति देता है somecommand, क्योंकि set -eस्क्रिप्ट somecommandविफल होने पर बाहर निकलने का कारण बनता है:

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