जवाबों:
किसी दिए गए टर्मिनल कमांड के निकास की स्थिति का अर्थ प्राप्त करने के लिए कोई "नुस्खा" नहीं है।
मेरा पहला प्रयास होगा पेज:
user@host:~# man ls
Exit status:
0 if OK,
1 if minor problems (e.g., cannot access subdirectory),
2 if serious trouble (e.g., cannot access command-line argument).
दूसरा : Google । देखें wget एक उदाहरण के रूप।
तीसरा : शेल की निकास स्थिति, उदाहरण के लिए बैश। बैश और यह बिलिन विशेष रूप से 125 से ऊपर के मूल्यों का उपयोग कर सकते हैं। कमांड के लिए 127 नहीं मिला, कमांड के लिए 126 निष्पादन योग्य नहीं है। अधिक जानकारी के लिए बैश निकास कोड देखें ।
बाहर निकलें कोड एक प्रोग्राम को समाप्त करते समय विफलता की स्थिति को इंगित करते हैं और वे 0 और 255 के बीच आते हैं। शेल और इसके बिल्डिंस विशिष्ट विफलता मोड को इंगित करने के लिए 125 से ऊपर के मानों का विशेष रूप से उपयोग कर सकते हैं, इसलिए कोड की सूची शेल और ऑपरेटिंग सिस्टम (जैसे बैश) के बीच भिन्न हो सकती है मूल्य + 128 + N का उपयोग निकास स्थिति के रूप में करता है)। देखें: बैश - 3.7.5 स्थिति से बाहर निकलें या man bash
।
सामान्य तौर पर एक शून्य निकास स्थिति इंगित करती है कि एक कमांड सफल हुआ , एक गैर-शून्य निकास स्थिति विफलता का संकेत देती है ।
यह जांचने के लिए कि कौन सा त्रुटि कोड कमांड द्वारा लौटाया गया है, आप $?
अंतिम निकास कोड के लिए प्रिंट कर सकते हैं या ${PIPESTATUS[@]}
जो शेल स्क्रिप्ट से बाहर निकलने के बाद पाइपलाइन (बैश में) से निकास स्थिति मानों की एक सूची देता है।
सभी एक्ज़िट कोड्स की पूरी सूची नहीं है, जो मिल सकते हैं, हालाँकि कर्नेल स्रोत में एक्ज़िट स्टेटस नंबरों को व्यवस्थित करने की कोशिश की गई है, लेकिन यह C / C ++ प्रोग्रामर के लिए मुख्य है और स्क्रिप्टिंग के लिए समान मानक उपयुक्त हो सकते हैं।
कार्यक्रमों और (64-78) के लिए बेहतर निकास कोड के साथ लिनक्स और बीएसडी / ओएस एक्स दोनों पर सहक्रियाओं की कुछ सूची /usr/include/sysexits.h
(या: man sysexits
बीएसडी पर) में पाई जा सकती है :
0 /* successful termination */
64 /* base value for error messages */
64 /* command line usage error */
65 /* data format error */
66 /* cannot open input */
67 /* addressee unknown */
68 /* host name unknown */
69 /* service unavailable */
70 /* internal software error */
71 /* system error (e.g., can't fork) */
72 /* critical OS file missing */
73 /* can't create (user) output file */
74 /* input/output error */
75 /* temp failure; user is invited to retry */
76 /* remote error in protocol */
77 /* permission denied */
78 /* configuration error */
/* maximum listed value */
उपरोक्त सूची 64-78 से पहले अप्रयुक्त निकास कोड आवंटित करती है। अनलॉफ़्ट किए गए निकास कोड की सीमा भविष्य में और प्रतिबंधित हो जाएगी।
हालांकि उपरोक्त मान मुख्य रूप से सेंडमेल में उपयोग किए जाते हैं और बहुत अधिक किसी और के द्वारा उपयोग किए जाते हैं, इसलिए वे दूरस्थ रूप से मानक के करीब कुछ भी नहीं हैं (जैसा कि @Gilles द्वारा बताया गया है )।
शेल में निकास स्थिति निम्नानुसार है (बैश पर आधारित):
1
- 125
- कमांड सफलतापूर्वक पूरा नहीं हुआ। स्थिति के अर्थ के लिए कमांड के मैन पेज की जाँच करें, नीचे कुछ उदाहरण हैं:
1
- सामान्य त्रुटियों के लिए कैटचेल
विविध त्रुटियां, जैसे "शून्य से विभाजित" और अन्य अभेद्य संचालन।
उदाहरण:
$ let "var1 = 1/0"; echo $?
-bash: let: var1 = 1/0: division by 0 (error token is "0")
1
2
- शेल बिल्डरों का दुरुपयोग (बैश प्रलेखन के अनुसार)
मिसिंग कीवर्ड या कमांड, या अनुमति समस्या (और एक असफल बाइनरी फ़ाइल तुलना पर रिटर्न कोड को अलग करें)।
उदाहरण:
empty_function() {}
6
- ऐसा कोई उपकरण या पता नहीं
उदाहरण:
$ curl foo; echo $?
curl: (6) Could not resolve host: foo
6
124
- कमांड बार
125
- यदि कोई कमांड खुद ही विफल हो जाती है : कोर्यूटिल्स126
- यदि कमांड मिली है, लेकिन उसे लागू नहीं किया जा सकता है (जैसे निष्पादन योग्य नहीं है)
अनुमति की समस्या या आदेश एक निष्पादन योग्य नहीं है।
उदाहरण:
$ /dev/null
$ /etc/hosts; echo $?
-bash: /etc/hosts: Permission denied
126
127
- यदि कोई आदेश नहीं मिल सकता है, तो इसे निष्पादित करने के लिए बनाई गई बच्चे की प्रक्रिया उस स्थिति को लौटाती है
$PATH
टाइपो या के साथ संभावित समस्या ।
उदाहरण:
$ foo; echo $?
-bash: foo: command not found
127
128
- के लिए अवैध तर्क exit
बाहर निकलने के लिए 0 - 255 की सीमा में केवल पूर्णांक होता है।
उदाहरण:
$ exit 3.14159
-bash: exit: 3.14159: numeric argument required
128
- 254
- घातक त्रुटि संकेत "एन" - एक संकेत प्राप्त करने के कारण कमांड की मृत्यु हो गई। स्थिति प्राप्त करने के लिए सिग्नल कोड 128 (128 + SIGNAL) में जोड़ा जाता है (लिनक्स:, man 7 signal
बीएसडी:) man signal
, नीचे कुछ उदाहरण हैं:
130
Ctrl-C दबाए जाने के कारण समाप्त आदेश, 130-128 = 2 (SIGINT)
उदाहरण:
$ cat
^C
$ echo $?
130
137
- यदि कमांड को KILL(9)
सिग्नल (128 + 9) भेजा जाता है, तो कमांड की निकास स्थिति अन्यथा
kill -9 $PPID
स्क्रिप्ट का।
141
- SIGPIPE
- बिना पाठक के साथ एक पाइप पर लिखें
उदाहरण:
$ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
$ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
xargs: cat: terminated by signal 13
$ echo ${PIPESTATUS[@]}
0 125 141
143
- सिग्नल कोड 15 (128 + 15 = 143) द्वारा समाप्त की गई कमांड
उदाहरण:
$ sleep 5 && killall sleep &
[1] 19891
$ sleep 100; echo $?
Terminated: 15
143
255
* - सीमा से बाहर निकलने की स्थिति।
बाहर निकलने के लिए 0 - 255 की सीमा में केवल पूर्णांक होता है।
उदाहरण:
$ sh -c 'exit 3.14159'; echo $?
sh: line 0: exit: 3.14159: numeric argument required
255
उपरोक्त तालिका के अनुसार, बाहर निकलने के कोड 1 - 2, 126 - 165, और 255 के विशेष अर्थ हैं, और इसलिए उपयोगकर्ता द्वारा निर्दिष्ट निकास मापदंडों से बचा जाना चाहिए।
कृपया ध्यान दें कि सीमा से बाहर निकलने के मूल्यों के परिणामस्वरूप अनपेक्षित निकास कोड हो सकते हैं (जैसे कि 3809 से बाहर निकलें 225, 3809% 256 (225) का निकास कोड देता है)।
देख:
errno
मान सिस्टम API द्वारा उपयोग किए जाते हैं, वे निकास स्थितियों के रूप में उपयोग नहीं किए जाते हैं (वे सही सीमा में भी नहीं हैं) और वे शेल स्क्रिप्टिंग के लिए अप्रासंगिक हैं। Sysexits मान Sendmail से हैं और बहुत अधिक किसी और के द्वारा उपयोग किया जाता है, वे किसी मानक के करीब कुछ भी नहीं हैं।
errno.h
यह अप्रासंगिक है जब यह कोड से बाहर निकलता है, केवल त्रुटि संदेश।
sysexits.h
। हालाँकि, कुछ कार्यक्रम रिटर्न errno
एस करते हैं , और मुझे लगता है कि रिटर्निंग errno
एस सबसे अधिक समझ में आता है। errno
अपवादों की तरह, अनहैन्डेड प्रोपेगेट ऊपर की ओर फैलता है, ( errno
रुके, फ़ंक्शन वापस आते हैं, -1
या 0|NULL
)। चूँकि प्रोग्राम केवल फ़ंक्शन होते हैं, भले ही फ़ंक्शन एक अलग एड्रेस स्पेस में चलाए जाते हैं, लेकिन यह समझ में आता है कि एक प्रोग्राम errno
प्रक्रिया सीमा के पार प्रचार जारी रखना चाह सकता है ।
"($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
।
जहां तक मुझे पता है, केवल दो, अधिक-या-कम, मानक मान हैं - दोनों stdlib.h
को निकास () के साथ उपयोग के लिए परिभाषित किया गया है :
और दुनिया में सभी कार्यक्रमों के लिए एक ही अर्थ रखने वाले एकमात्र डी-वास्तविक मानक, 0 (शून्य) है जो SUCCESS के लिए है।
अलग-अलग कार्यक्रम विभिन्न त्रुटियों (विभिन्न प्रकार या गंभीरता) को अलग करने या जोर देने के लिए लौटे "विफलता" की अलग-अलग सूची पेश करते हैं। कुछ प्रोग्राम खोजे गए रनटाइम त्रुटियों की पूर्णांक संख्या (उदाहरण के लिए, सूट में विफल इकाई-परीक्षणों की संख्या) की रिपोर्ट करने के लिए दिए गए मान का भी उपयोग करते हैं।
मैं किसी भी तरह के "नए मानक" को शुरू करने की सिफारिश नहीं करूंगा stdlib.h