शेल स्क्रिप्ट की निकास स्थिति के लिए "आरक्षित" कोड का उपयोग करना


15

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

उपरोक्त तालिका के अनुसार, बाहर निकलने के कोड 1-2, 126-165 और 255 के विशेष अर्थ हैं, और इसलिए उपयोगकर्ता द्वारा निर्दिष्ट निकास मापदंडों से बचा जाना चाहिए।

कुछ समय पहले, मैंने एक स्क्रिप्ट लिखी थी जिसमें निम्नलिखित निकास स्थिति कोड का उपयोग किया गया था:

  • 0 - सफलता
  • 1 - गलत होस्टनाम
  • 2 - अमान्य तर्क निर्दिष्ट
  • 3 - अपर्याप्त उपयोगकर्ता विशेषाधिकार

जब मैंने स्क्रिप्ट लिखी तो मुझे किसी विशेष निकास कोड के बारे में पता नहीं था, इसलिए मैंने पहली त्रुटि स्थिति के लिए बस 1 पर शुरू किया, और प्रत्येक क्रमिक त्रुटि प्रकार के लिए निकास स्थिति बढ़ा दी।

मैंने पटकथा इस इरादे से लिखी थी कि बाद के चरण में इसे अन्य लिपियों द्वारा बुलाया जा सकता है (जो गैर-शून्य निकास कोड के लिए जाँच कर सकते हैं)। मैंने वास्तव में अभी तक ऐसा नहीं किया है; अब तक मैंने केवल अपने इंटरेक्टिव शेल (बैश) से स्क्रिप्ट को चलाया है और मैं सोच रहा था कि क्या / यदि मेरे एक्जिट कोड के उपयोग से कोई समस्या हो सकती है। उन्नत बैश-स्क्रिप्टिंग गाइड से सिफारिश कितनी प्रासंगिक / महत्वपूर्ण है?

मुझे बैश डॉक्यूमेंटेशन में कोई कोरोबाइब्रेटिंग सलाह नहीं मिली; एग्जिट स्टेटस पर इसका सेक्शन बस बैश द्वारा उपयोग किए जाने वाले एग्जिट कोड को सूचीबद्ध करता है, लेकिन यह नहीं बताता है कि इनमें से कोई भी आरक्षित है या आपकी स्वयं की स्क्रिप्ट / कार्यक्रमों के लिए उपयोग करने के खिलाफ चेतावनी देता है।


6
मैं और अन्य, ABSG को आम तौर पर कम गुणवत्ता वाला मानते हैं। मेरी राय में आपके द्वारा लिंक किए गए पृष्ठ का लेखक एक असमर्थित दावा कर रहा है कि सूचीबद्ध निकास कोड आरक्षित हैं, जाहिर है, इस तथ्य पर कि शेल स्वयं विशिष्ट अर्थों के लिए उनका उपयोग करता है। लिपियों के लिए मानक बनाने का प्रयास किया गया है, जिनमें से किसी को भी कोई सफलता नहीं मिली है। महत्वपूर्ण बात यह है कि आपके द्वारा चुने गए त्रुटि कोड का दस्तावेजीकरण करें ताकि आपकी स्क्रिप्ट के उपभोक्ता (जैसे अन्य स्क्रिप्ट) जानते हों कि उनके आधार पर क्या करना है।
अगली सूचना तक रोक दिया गया।

यदि आप अपनी टिप्पणी को उत्तर के रूप में पोस्ट करते हैं, तो मैं इसे अपवित्र कर पाऊंगा; मैंने पहले से ही अन्य सभी उत्तरों को वोट दिया है क्योंकि मैंने उनमें से प्रत्येक को उपयोगी पाया। जबकि आपका उत्तर डेविड किंग्स (और कुछ हद तक ज्वॉल के) की सामग्री के समान है, आप स्पष्ट रूप से कहते हैं कि एबीएसजी उद्धरण में दावे के लिए कोई सबूत नहीं है।
एंथोनी जोगेगन

1
प्रस्ताव के लिए धन्यवाद, लेकिन मेरा मानना ​​है कि मेरी टिप्पणी इस तरह से रहना चाहिए।
अगली सूचना तक रोक दिया गया।

जब से मुझे पता चला है कि POSIX विनिर्देश में इसी तरह की सलाह शामिल है, तो मैंने उस जानकारी को अपने उत्तर में जोड़ दिया है (इस प्रश्न को पूछने के बाद से मेरे शोध के परिणाम शामिल हैं)।
एंथनी जोगेगन

जवाबों:


10

प्रक्रिया निकास कोड के अर्थों को मानकीकृत करने के कई प्रयास किए गए हैं। आपके द्वारा उल्लेखित एक के अलावा, मुझे पता है:

  • बीएसडी के पास sysexits.h64 से मूल्यों के अर्थों को परिभाषित करता है।

  • जीएनयू grepदस्तावेज़ जो कोड से बाहर निकलते हैं, इसका मतलब है कि कम से कम एक मैच पाया गया, 1 का मतलब है कि कोई मैच नहीं मिला, और 2 का मतलब है I / O त्रुटि हुई; यह सम्मेलन स्पष्ट रूप से अन्य कार्यक्रमों के लिए भी उपयोगी है जिसके लिए "कुछ भी गलत नहीं हुआ, लेकिन मुझे कुछ भी नहीं मिला" और "आई / ओ त्रुटि हुई" के बीच का अंतर सार्थक है।

  • C लाइब्रेरी फ़ंक्शन के कई कार्यान्वयन systemप्रोग्राम को मौजूद नहीं होने या प्रारंभ करने में विफल रहने का संकेत देने के लिए निकास कोड 127 का उपयोग करते हैं।

  • विंडोज पर, NTSTATUSकोड (जो कि 32-बिट नंबर स्थान पर असुविधाजनक रूप से बिखरे हुए हैं) को बाहर निकलने वाले कोड के रूप में उपयोग किया जा सकता है, विशेष रूप से जो एक प्रक्रिया को इंगित करते हैं जो भयावह दुर्व्यवहार (जैसे STATUS_STACK_OVERFLOW) के कारण समाप्त हो गए थे ।

आप इन सम्मेलनों में से किसी भी विशेष को मानने वाले किसी भी कार्यक्रम पर भरोसा नहीं कर सकते। एकमात्र विश्वसनीय नियम यह है कि एग्जिट कोड 0 सफलता है और कुछ और किसी प्रकार की विफलता है। (ध्यान दें कि C89 के EXIT_SUCCESSहै नहीं मान शून्य है की गारंटी है, लेकिन, exit(0)के लिए समान रूप से व्यवहार करने की आवश्यकता है exit(EXIT_SUCCESS)। यहां तक कि अगर मान ही नहीं हैं)


धन्यवाद। दूसरों पर एक उत्तर चुनना मुश्किल था, लेकिन मैं इसे स्वीकार कर रहा हूं क्योंकि इसने मेरे प्रश्न का उत्तर दिया है, साथ ही उपयोग में अलग-अलग निकास कोड (प्रासंगिक लिंक के साथ) का एक व्यापक स्वाद प्रदान करता है: यह 3 से अधिक के लायक है वर्तमान में है।
एंथोनी जोगेगन

11

किसी भी एक्जिट कोड का कोई विशेष अर्थ नहीं है, लेकिन मूल्य में $?एक विशेष अर्थ हो सकता है।

बॉर्न शेल और ksh93 जिस तरह से शेल वेरिएबल के लिए बाहर निकलने के कोड और त्रुटि स्थितियों को संभाला और $?समस्या है। आप जो सूचीबद्ध करते हैं, उसके विपरीत, केवल निम्नलिखित मानों $?का एक विशेष अर्थ होता है:

  • 126 बाइनरी को निष्पादित नहीं कर सका, भले ही यह मौजूद हो
  • 127 निर्दिष्ट बाइनरी मौजूद नहीं है
  • 128 निकास स्थिति == 0 थी, लेकिन कुछ अनिर्दिष्ट समस्या मौजूद है

इसके अलावा, एक अनिर्दिष्ट खोल और $?कोड की विशिष्ट श्रेणी > 128 है जो एक प्रोग्राम के लिए आरक्षित है जो एक सिग्नल द्वारा बाधित किया गया था:

  • बॉर्न शेल बैश और ksh88 128 + सिग्नल नंबर का उपयोग करते हैं
  • ksh93 256 + सिग्नल नंबर का उपयोग करता है।

अन्य मान समस्याएं नहीं देते क्योंकि वे शेल-विशेष $?मानों से भिन्न हो सकते हैं।

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

बॉर्न शेल के नए संस्करण प्रोग्राम से बाहर निकलने waitid()के waitpid()लिए प्रतीक्षा करने के बजाय उपयोग करते हैं और waitid()(SVr4 के लिए 1989 में) एक बेहतर syscall इंटरफ़ेस का उपयोग करता है (1980 में पहले से ही यूएनओएस के समान)।

के रूप में नए बॉर्न शैल संस्करणों सांकेतिक शब्दों में बदलना बाहर निकलने के कारण एक अलग चर में ${.sh.code}/ ${.sh.codename}से बाहर निकलने के कोड में है कि ${.sh.status}/ ${.sh.termsig}, देखें http://schillix.sourceforge.net/man/man1/bosh.1.html , बाहर निकलें कोड ओवरलोड न हो जाए विशेष राज्यों के साथ, और, `वेटिड () का उपयोग करने के परिणामस्वरूप, बॉर्न शेल अब निकास कोड के सभी 32 बिट्स को वापस करने का समर्थन करता है - न कि केवल कम 8 बिट्स।

BTW: exit(256)सी-प्रोग्राम या शेल स्क्रिप्ट से या इसके समान सावधान रहें , क्योंकि इसका परिणाम $?एक क्लासिक शेल में 0 के रूप में व्याख्या किया जा सकता है।


2
BTW: मैंने waitid()मई के आसपास इस बग के लिए FreeBSD और लिनक्स कर्नेल के खिलाफ एक बग रिपोर्ट बनाई थी। FreeBSD के लोगों ने 20 घंटों के भीतर समस्या को ठीक कर दिया, लिनक्स लोग अपनी बग को ठीक करने में रुचि नहीं रखते हैं। ... और
साइगविन

2
यह व्यवहार एकल यूनिक्स विनिर्देश द्वारा आवश्यक है। 32-बिट मान है, हाँ, लेकिन उस मान में 8-बिट बिटफ़ील्ड होता है जिसमें से कम 8 बिट्स होते हैं _exit। कृपया उस FreeBSD बग रिपोर्ट को लिंक करें जिसका आप उल्लेख कर रहे हैं, हो सकता है कि मैं आपके द्वारा बताए गए मुद्दे को गलत समझ रहा हूं।
178 बजे रैंडम 832

2
ओपी ने बैश के साथ प्रश्न को टैग किया और प्रश्न के पाठ में बैश का उल्लेख किया। बैश एक बॉर्न-व्युत्पन्न खोल है। यह ${.sh.}चर का समर्थन नहीं करता है। हालाँकि, यह सच है कि आप "बॉर्न" कहते हैं, न कि "बॉर्न-व्युत्पन्न" (हालाँकि आप ksh93 को शामिल करते हैं)।
अगली सूचना तक रोक दिया गया।

2
यह उत्तर कुछ एसवीआर 4-व्युत्पन्न यूनिक्स के आपके विशेष संस्करण के लिए बहुत विशिष्ट प्रतीत होता है। कृपया स्पष्ट करें कि क्या पोर्टेबल है और क्या नहीं है, इस बात को ध्यान में रखते हुए कि "" बॉर्न शेल जैसी कोई चीज नहीं है, जब तक कि आप का मतलब वी 7 में न हो।
zwol

4
इसके विपरीत, मेरा मानना ​​है कि यह आप ही हैं जो यहाँ भिन्नता की सीमा को समझ रहे हैं, विशेषकर ऐतिहासिक भिन्नता को। आप इसे ध्वनि की तरह बनाते /bin/shहैं ताकि इन विशेष निकास कोडों को क्रॉस-प्लेटफॉर्म पर लगातार व्यवहार करने पर भरोसा किया जा सके, जो कि सच नहीं है। (मुझे परवाह नहीं है कि क्या किसी विशेष प्रणाली /bin/shको "वास्तविक बॉर्न शेल" कहा जा सकता है। यह जानने के लिए अधिक महत्वपूर्ण है कि इसमें से कोई भी POSIX में नहीं है, और यह कि अधिकांश चीजें आप "वास्तविक यूनिक्स सिस्टम" डॉन के रूप में उद्धृत करते हैं। टी /bin/shवैसे भी एक POSIX- शिकायत प्रदान करते हैं ।)
zwol

6

शेल स्क्रिप्टिंग के लिए, मैं कभी-कभी sysexist.hशेल-आरक्षित एग्ज़िट कोड (साथ उपसर्ग S_EX_) के साथ शेल के बराबर होता है , जिसे नाम दिया गया हैexit.sh

यह मूल रूप से है:

EX_OK=0 # successful termination 
EX__BASE=64     # base value for error messages 
EX_USAGE=64     # command line usage error 
EX_DATAERR=65   # data format error 
EX_NOINPUT=66   # cannot open input 
EX_NOUSER=67    # addressee unknown 
EX_NOHOST=68    # host name unknown 
EX_UNAVAILABLE=69       # service unavailable 
EX_SOFTWARE=70  # internal software error 
EX_OSERR=71     # system error (e.g., can't fork) 
EX_OSFILE=72    # critical OS file missing 
EX_CANTCREAT=73 # can't create (user) output file 
EX_IOERR=74     # input/output error 
EX_TEMPFAIL=75  # temp failure; user is invited to retry 
EX_PROTOCOL=76  # remote error in protocol 
EX_NOPERM=77    # permission denied 
EX_CONFIG=78    # configuration error 
EX__MAX=78      # maximum listed value 

#System errors
S_EX_ANY=1      #Catchall for general errors
S_EX_SH=2       #Misuse of shell builtins (according to Bash documentation); seldom seen
S_EX_EXEC=126   #Command invoked cannot execute         Permission problem or command is not an executable
S_EX_NOENT=127  #"command not found"    illegal_command Possible problem with $PATH or a typo
S_EX_INVAL=128  #Invalid argument to exit       exit 3.14159    exit takes only integer args in the range 0 - 255 (see first footnote)                                                                                        
#128+n  Fatal error signal "n"  kill -9 $PPID of script $? returns 137 (128 + 9)                               
#255*   Exit status out of range        exit -1 exit takes only integer args in the range 0 - 255              
S_EX_HUP=129                                                                                                   
S_EX_INT=130   
#...

और के साथ उत्पन्न किया जा सकता है:

#!/bin/sh
src=/usr/include/sysexits.h
echo "# Generated from \"$src\"" 
echo "# Please inspect the source file for more detailed descriptions"
echo
< "$src" sed -rn 's/^#define  *(\w+)\s*(\d*)/\1=\2/p'| sed 's:/\*:#:; s:\*/::'
cat<<'EOF'

#System errors
S_EX_ANY=1  #Catchall for general errors
S_EX_SH=2   #Misuse of shell builtins (according to Bash documentation); seldom seen
S_EX_EXEC=126   #Command invoked cannot execute     Permission problem or command is not an executable
S_EX_NOENT=127  #"command not found"    illegal_command Possible problem with $PATH or a typo
S_EX_INVAL=128  #Invalid argument to exit   exit 3.14159    exit takes only integer args in the range 0 - 255 (see first footnote)
#128+n  Fatal error signal "n"  kill -9 $PPID of script $? returns 137 (128 + 9)
#255*   Exit status out of range    exit -1 exit takes only integer args in the range 0 - 255
EOF
$(which kill) -l |tr ' ' '\n'| awk '{ printf "S_EX_%s=%s\n", $0, 128+NR; }'

मैं इसका ज्यादा उपयोग नहीं करता, हालांकि, लेकिन मैं जो उपयोग करता हूं वह एक शेल फ़ंक्शन है जो त्रुटि कोड को उनके स्ट्रिंग प्रारूपों में उलट देता है। मैंने इसका नाम रखा है exit2str। यह मानकर कि आपने उपरोक्त exit.shजनरेटर का नाम दिया है exit.sh.sh, के लिए कोड exit2str( exit2str.sh.sh) के साथ उत्पन्न किया जा सकता है :

#!/bin/sh
echo '
exit2str(){
  case "$1" in'
./exit.sh.sh | sed -nEe's|^(S_)?EX_(([^_=]+_?)+)=([0-9]+).*|\4) echo "\1\2";;|p'
echo "
  esac
}"

मैं PS1अपने इंटरेक्टिव शेल का उपयोग करता हूं ताकि प्रत्येक कमांड के चलने के बाद, मैं इसकी निकास स्थिति और इसके स्ट्रिंग रूप (अगर यह एक ज्ञात स्ट्रिंग रूप है) देख सकता हूं:

[15:58] pjump@laptop:~ 
(0=OK)$ 
[15:59] pjump@laptop:~ 
(0=OK)$ fdsaf
fdsaf: command not found
[15:59] pjump@laptop:~ 
(127=S_NOENT)$ sleep
sleep: missing operand
Try 'sleep --help' for more information.
[15:59] pjump@laptop:~ 
(1=S_ANY)$ sleep 100
^C
[15:59] pjump@laptop:~ 
(130=S_INT)$ sleep 100
^Z
[1]+  Stopped                 sleep 100
[15:59] pjump@laptop:~ 
(148=S_TSTP)$

इन्हें प्राप्त करने के लिए, आपको बाहर निकलने के 2 फंक्शन के लिए एक अछूता होना चाहिए:

$ ./exit2str.sh.sh > exit2str.sh #Place this somewhere in your PATH

और फिर ~/.bashrcप्रत्येक कमांड प्रॉम्प्ट पर निकास कोड को सहेजने और अनुवाद करने के लिए इसे अपने में उपयोग करें और इसे अपने प्रॉम्प्ट ( PS1) को प्रदर्शित करें :

    # ...
    . exit2str.sh
PROMPT_COMMAND='lastStatus=$(st="$?"; echo -n "$st"; str=$(exit2str "$st") && echo "=$str"); # ...'
    PS1="$PS1"'\n($lastStatus)\$'
    # ...                                                                                   

यह देखने के लिए काफी आसान है कि कुछ प्रोग्राम एग्जिट कोड कन्वेंशन का पालन कैसे करते हैं और कुछ नहीं, एग्जिट कोड कन्वेंशनों के बारे में जानने के लिए, या सिर्फ यह देखने के लिए कि अधिक आसानी से क्या हो रहा है। कुछ समय के लिए इसका उपयोग करने के बाद, मैं कह सकता हूं कि कई सिस्टम-उन्मुख शेल स्क्रिप्ट सम्मेलनों का पालन करते हैं। EX_USAGEविशेष रूप से काफी सामान्य है, हालांकि अन्य कोड, ज्यादा नहीं। मैं समय-समय पर सम्मेलनों का पालन करने की कोशिश करता हूं, हालांकि $S_EX_ANYआलसी लोगों (मैं एक हूं) के लिए हमेशा (1) रहता हूं।


मुझे आश्चर्य है कि अगर कोई त्रुटि कोड और एग्जिट कोड के बीच मैपिंग जैसी कोई चीज है, तो उस एरर कोड के साथ रिपोर्ट की गई त्रुटि एरर एग्जिट में निकलती है। मुझे कुछ उचित मानचित्रण के साथ आने की आवश्यकता हो सकती है।
PSkocik

1
वाह! मैं इस तरह के एक विस्तृत जवाब की उम्मीद नहीं कर रहा था। मैं निश्चित रूप से यह देखने का प्रयास करूंगा कि अलग-अलग कमांड कैसे व्यवहार करते हैं। धन्यवाद।
एंथोनी जोगेगन

4

जब तक आप अपने एग्जिट कोड को डॉक्यूमेंट करते हैं ताकि आप उन्हें एक साल बाद से याद रखें जब आपको वापस आना होगा और स्क्रिप्ट को ठीक किया जाएगा, तो आप ठीक हो जाएंगे। "आरक्षित निकास कोड" का विचार वास्तव में अब लागू नहीं होता है क्योंकि यह कहना है कि यह 0एक सफलता कोड के रूप में उपयोग करने के लिए प्रथा है और एक विफलता कोड के रूप में कुछ और।


4

सबसे अच्छा संदर्भ जो मुझे मिल सकता था, वह यह था: http://tldp.org/LDP/abs/html/exitcodes.html

इसके अनुसार:

1 त्रुटियों के लिए एक सामान्य catchall है, और मैंने हमेशा इसे उपयोगकर्ता परिभाषित त्रुटियों के लिए उपयोग किया है।

2 एक शेल सिंटैक्स त्रुटि के रूप में निर्मित शेल के दुरुपयोग के लिए है

आपके प्रश्न का उत्तर देने के लिए आपकी स्क्रिप्ट सीधे आरक्षित त्रुटि कोड का उपयोग करके ठीक होगी, यह अपेक्षित है कि आप त्रुटि कोड = 1/2/3 के आधार पर त्रुटि को संभालने की अपेक्षा करेंगे।

हालांकि, संभवतः यह भ्रमित करने वाला होगा यदि आप किसी ऐसे व्यक्ति से मिलते हैं जो आरक्षित त्रुटि कोड जानता है और उसका उपयोग करता है, जो काफी दुर्लभ लगता है।

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

if [ $? -ne 0 ];then
    echo "Error type"
    exit 1
fi

2

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

ऐसा लगता है कि उन्नत बैश-स्क्रिप्टिंग गाइड के लेखक बीएसडी से बाहर निकलने के कोड ( sysexits.h) को मानकीकृत करने के प्रयासों से सहमत हैं और बस सिफारिश कर रहे हैं कि जब उपयोगकर्ता शेल स्क्रिप्ट लिखते हैं, तो वे एग्ज़िट कोड निर्दिष्ट नहीं करते हैं जो पहले से निर्धारित निकास कोड के साथ संघर्ष करते हैं। उपयोग में, यानी, उन्होंने अपने कस्टम एक्ज़िट कोड्स को 64-113 रेंज में 50 उपलब्ध स्टेटस कोड्स तक सीमित कर दिया है।

मैं इस विचार (और तर्क) की सराहना करता हूं, लेकिन मैंने पसंद किया है यदि लेखक अधिक स्पष्ट था कि सलाह को नजरअंदाज करना हानिकारक नहीं है - उन मामलों से अलग, जहां एक स्क्रिप्ट का उपभोक्ता त्रुटियों की जांच कर रहा है जैसे कि 127 का उदाहरण दिया गया है ( command not found)।

प्रासंगिक POSIX विनिर्देशों

मैंने शोध किया कि एग्ज़िट कोड के बारे में पॉसिक्स का क्या कहना है और पॉसिक्स स्पेसिफिकेशन एडवांस बैश-स्क्रिप्टिंग गाइड के लेखक के साथ मिलकर लगता है। मैंने प्रासंगिक POSIX विनिर्देशों (मेरा जोर) उद्धृत किया है:

कमांड के लिए स्थिति से बाहर निकलें

प्रत्येक कमांड में एक निकास स्थिति होती है जो अन्य शेल कमांड के व्यवहार को प्रभावित कर सकती है। इस खंड में उपयोगिताओं का आदेश न देने वाली स्थिति का दस्तावेजीकरण किया गया है। मानक उपयोगिताओं की निकास स्थिति उनके संबंधित वर्गों में प्रलेखित है।

यदि कोई कमांड नहीं मिली है, तो निकास स्थिति 127 होगी। यदि कमांड नाम पाया जाता है, लेकिन यह निष्पादन योग्य उपयोगिता नहीं है, तो निकास स्थिति 126 होगी। शेल का उपयोग किए बिना उपयोगिताओं को लागू करने वाले अनुप्रयोग इन निकास स्थिति मूल्यों का उपयोग करना चाहिए इसी तरह की त्रुटियों की रिपोर्ट करने के लिए।

यदि शब्द विस्तार या पुनर्निर्देशन के दौरान कोई कमांड विफल रहता है, तो इसकी निकास स्थिति शून्य से अधिक होगी।

आंतरिक रूप से, यह तय करने के प्रयोजनों के लिए कि क्या कोई आदेश गैर-शून्य निकास स्थिति के साथ बाहर निकलता है, शेल प्रतीक्षा के बराबर () फ़ंक्शन WEXITSTATUS मैक्रो के अनुसार कमांड के लिए प्राप्त पूरे स्थिति मान को पहचान लेगा (जैसा कि सिस्टम इंटरफ़ेस में परिभाषित किया गया है) POSIX.1-2008)। विशेष पैरामीटर '?' के साथ बाहर निकलने की स्थिति की रिपोर्ट करते समय, शेल निकास स्थिति की पूर्ण आठ बिट्स की रिपोर्ट करेगा। एक आदेश की समाप्ति स्थिति जिसे एक संकेत प्राप्त हुआ क्योंकि उसे 128 से अधिक बताया जाएगा।

exitउपयोगिता

के रूप में अन्य वर्गों में बताया गया है, कुछ बाहर निकलें स्थिति मानों दिया है सुरक्षित विशेष उपयोगों के लिए और चाहिए केवल उन उद्देश्यों के लिए आवेदन पत्र द्वारा इस्तेमाल किया जा:

  • 126 - निष्पादित की जाने वाली एक फाइल मिली थी, लेकिन यह निष्पादन योग्य उपयोगिता नहीं थी।
  • 127 - निष्पादित की जाने वाली उपयोगिता नहीं मिली।
  • >128 - एक सिग्नल द्वारा एक कमांड को बाधित किया गया था।

अग्रिम जानकारी

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

128 से बाहर निकलने की स्थिति उत्पन्न करने का प्रयास

बैश संस्करणों 3.2.25 और 4.2.46 का उपयोग करते हुए, मैंने एक 128 Invalid argument to exitत्रुटि फेंकने की कोशिश की लेकिन हर बार मुझे 255 (सीमा से बाहर निकलने की स्थिति) प्राप्त हुई। उदाहरण के लिए, यदि exit 3.14159इसे शेल स्क्रिप्ट या इंटरेक्टिव चाइल्ड शेल के भाग के रूप में निष्पादित किया जाता है, तो शेल एक कोड के साथ बाहर निकलता है 255:

$ exit 3.14159
exit
bash: exit: 3.14159: numeric argument required

और भी मज़ेदार के लिए, मैंने एक साधारण सी प्रोग्राम चलाने की कोशिश की, लेकिन इस मामले में, ऐसा लगता है कि exit(3)फ़ंक्शन ने फ़्लोटिंग को बाहर निकलने से पहले एक इंट (3 इस मामले में) में बदल दिया:

#include <stdlib.h>
main()
{
    exit(3.14159);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.