प्रोसेसर्स अपने माता-पिता के लिए एक एक्जिट कोड की रिपोर्ट करने के लिए पूर्णांक तर्क के साथ _exit()सिस्टम कॉल (लिनक्स पर, यह भी देखें exit_group()) को कॉल कर सकते हैं । यद्यपि यह पूर्णांक है, केवल 8 कम से कम महत्वपूर्ण बिट्स माता-पिता के लिए उपलब्ध हैं (अपवाद है कि जब उस कोड को पुनः प्राप्त करने के लिए माता-पिता में SIGCHLD पर उपयोग waitid()या हैंडलर , हालांकि लिनक्स पर नहीं)।
माता-पिता आमतौर पर एक पूर्णांक के रूप में अपने बच्चे की स्थिति प्राप्त करने के लिए wait()या (हालांकि कुछ अलग शब्दार्थों के रूप में अच्छी तरह से इस्तेमाल किया जा सकता है)।waitpid()waitid()
लिनक्स और अधिकांश यूनियनों पर, यदि प्रक्रिया सामान्य रूप से समाप्त हो जाती है, तो उस स्थिति संख्या के 8 से 15 बिट्स में पास होने के रूप में निकास कोड होगा exit()। यदि नहीं, तो 7 कम से कम महत्वपूर्ण बिट्स (0 से 6) में सिग्नल संख्या होगी और बिट 7 सेट किया जाएगा यदि कोई कोर डंप किया गया था।
perlके $?उदाहरण के लिए कि संख्या से सेट के रूप में शामिल हैं waitpid():
$ perl -e 'system q(kill $$); printf "%04x\n", $?'
000f # killed by signal 15
$ perl -e 'system q(kill -ILL $$); printf "%04x\n", $?'
0084 # killed by signal 4 and core dumped
$ perl -e 'system q(exit $((0xabc))); printf "%04x\n", $?'
bc00 # terminated normally, 0xbc the lowest 8 bits of the status
बॉर्न की तरह के गोले भी अपने $?चर में अंतिम रन कमांड की निकास स्थिति बनाते हैं । हालाँकि, इसमें सीधे तौर पर दी गई संख्या नहीं होती है waitpid(), लेकिन इस पर एक परिवर्तन होता है, और यह गोले के बीच भिन्न होता है।
यदि सभी प्रक्रिया सामान्य रूप से समाप्त हो जाती हैं, तो सभी गोले के बीच सामान्य बात यह है कि $?बाहर निकलने वाले कोड के सबसे कम 8 बिट्स (पास की गई संख्या exit()) शामिल हैं।
जहां यह भिन्न होता है जब सिग्नल द्वारा प्रक्रिया को समाप्त किया जाता है। सभी मामलों में, और यह POSIX द्वारा आवश्यक है, संख्या 128 से अधिक होगी। POSIX निर्दिष्ट नहीं करता है कि मूल्य क्या हो सकता है। हालांकि अभ्यास में, मुझे पता है कि सभी बॉर्न-जैसे गोले में, सबसे कम 7 बिट्स में $?सिग्नल नंबर होगा। लेकिन, nसिग्नल नंबर कहां है,
राख में, zsh, pdksh, bash, बॉर्न शेल, $?है 128 + n। इसका मतलब यह है कि उन गोले में, यदि आप एक प्राप्त करते $?हैं 129, तो आप यह नहीं जानते कि क्या यह प्रक्रिया के साथ बाहर निकल गया है exit(129)या क्या यह सिग्नल द्वारा मारा गया था 1( HUPअधिकांश प्रणालियों पर)। लेकिन तर्क यह है कि गोले, जब वे खुद से बाहर निकलते हैं, तो डिफ़ॉल्ट रूप से अंतिम निकास कमांड की निकास स्थिति को वापस करते हैं। यह सुनिश्चित करके कि $?यह 255 से अधिक नहीं है, कि एक सुसंगत निकास स्थिति की अनुमति देता है:
$ bash -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
bash: line 1: 16720 Terminated sh -c "kill \$\$"
8f # 128 + 15
$ bash -c 'sh -c "kill \$\$"; exit'; printf '%x\n' "$?"
bash: line 1: 16726 Terminated sh -c "kill \$\$"
8f # here that 0x8f is from a exit(143) done by bash. Though it's
# not from a killed process, that does tell us that probably
# something was killed by a SIGTERM
ksh93, $?है 256 + n। इसका मतलब है कि $?आप एक मूल्य से एक मारे गए और गैर-मारे गए प्रक्रिया के बीच अंतर कर सकते हैं। kshबाहर निकलने के नए संस्करण , यदि $?255 से अधिक थे , तो अपने माता-पिता को उसी निकास स्थिति की रिपोर्ट करने में सक्षम होने के लिए उसी संकेत के साथ खुद को मारता है। जबकि यह एक अच्छा विचार लगता है, इसका मतलब है कि यदि kshएक अतिरिक्त कोर डंप उत्पन्न होगा (संभावित रूप से एक दूसरे को अधिलेखित करना) अगर प्रक्रिया एक कोर जनरेटिंग सिग्नल द्वारा मार दी गई थी:
$ ksh -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
ksh: 16828: Terminated
10f # 256 + 15
$ ksh -c 'sh -c "kill -ILL \$\$"; exit'; printf '%x\n' "$?"
ksh: 16816: Illegal instruction(coredump)
Illegal instruction(coredump)
104 # 256 + 15, ksh did indeed kill itself so as to report the same
# exit status as sh. Older versions of `ksh93` would have returned
# 4 instead.
तुम भी कहाँ कह सकते हैं वहाँ एक बग है कि ksh93खुद को मारता है, भले ही $?एक से आता है return 257एक समारोह के द्वारा किया:
$ ksh -c 'f() { return "$1"; }; f 257; exit'
zsh: hangup ksh -c 'f() { return "$1"; }; f 257; exit'
# ksh kills itself with a SIGHUP so as to report a 257 exit status
# to its parent
yash। yashएक समझौता प्रदान करता है। यह लौट आता है 256 + 128 + n। इसका मतलब है कि हम एक मारे गए प्रक्रिया और ठीक से समाप्त होने वाले के बीच अंतर कर सकते हैं। और बाहर निकलने पर, यह 128 + nखुद को आत्महत्या किए बिना रिपोर्ट करेगा और इसके दुष्प्रभाव हो सकते हैं।
$ yash -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
18f # 256 + 128 + 15
$ yash -c 'sh -c "kill \$\$"; exit'; printf '%x\n' "$?"
8f # that's from a exit(143), yash was not killed
के मूल्य से संकेत प्राप्त करने के लिए $?, पोर्टेबल तरीके का उपयोग करना है kill -l:
$ /bin/kill 0
Terminated
$ kill -l "$?"
TERM
(पोर्टेबिलिटी के लिए, आपको सिग्नल नंबर, केवल सिग्नल के नाम का उपयोग नहीं करना चाहिए)
गैर-बॉर्न मोर्चों पर:
csh/ tcshऔर fishबॉर्न शेल के समान है सिवाय इसके कि स्थिति $statusइसके बजाय है $?(ध्यान दें कि अनुकूलता के लिए zshभी सेट करता है ) (इसके अलावा )।$statuscsh$?
rc: बाहर निकलने की स्थिति में $statusभी है, लेकिन जब एक संकेत द्वारा मार डाला, उस चर में एक नंबर के बजाय संकेत का नाम होता है (जैसे sigtermया sigill+coreयदि कोई कोर उत्पन्न हुआ था), जो अभी तक उस शेल के अच्छे डिजाइन का एक और सबूत है ।
es। बाहर निकलने की स्थिति एक चर नहीं है। यदि आप इसकी देखभाल करते हैं, तो आप कमांड को निम्नानुसार चलाते हैं:
status = <={cmd}
जो एक नंबर या वापस आ जाएगी sigtermया sigsegv+coreमें की तरह rc।
हो सकता है कि पूर्णता के लिए, हमें zsh's' $pipestatusऔर bash's $PIPESTATUSसरणियों का उल्लेख करना चाहिए, जिनमें अंतिम पाइपलाइन के घटकों की निकास स्थिति है।
और पूर्णता के लिए भी, जब यह शेल फ़ंक्शंस और सोर्स किए गए फ़ाइलों की बात आती है, तो डिफ़ॉल्ट फ़ंक्शंस द्वारा अंतिम कमांड रन की एक्ज़िट स्थिति के साथ लौटते हैं, लेकिन returnबिलिन के साथ स्पष्ट रूप से रिटर्न स्टेटस भी सेट कर सकते हैं । और हम यहाँ कुछ अंतर देखते हैं:
bashऔर mksh(R41 के बाद से, एक प्रतिगमन ^ Wchange जाहिरा तौर पर जानबूझकर पेश किया गया) 8 बिट्स (सकारात्मक या नकारात्मक) को छोटा कर देगा। तो उदाहरण के लिए return 1234सेट हो जाएगा $?करने के लिए 210, return -- -1सेट हो जाएगा $?255।
zshऔर pdksh(और डेरिवेटिव के अलावा mksh) किसी भी हस्ताक्षर किए गए 32 बिट दशमलव पूर्णांक (-2 31 से 2 31 -1) और (संख्या को 32 बिट तक कम करें ) की अनुमति दें ।
ashऔर yash0 से 2 31 -1 तक किसी भी सकारात्मक पूर्णांक की अनुमति दें और उसमें से किसी भी संख्या के लिए एक त्रुटि लौटाएं।
ksh93के रूप में सेट return 0करने के लिए है, लेकिन कुछ और के लिए, 8 बिट्स को काटें। जैसा कि पहले ही उल्लेख किया गया है कि 256 और 320 के बीच की संख्या लौटाने से बाहर निकलने पर खुद को मारना पड़ सकता है।return 320$?ksh
rcऔर esसूची में से कुछ भी वापस करने की अनुमति दें।
यह भी ध्यान रखें कि कुछ गोले भी की विशेष मूल्यों का उपयोग $?/ $statusकुछ त्रुटि की स्थिति है कि एक प्रक्रिया के निकास की स्थिति, नहीं कर रहे हैं की तरह रिपोर्ट करने के लिए 127या 126के लिए नहीं मिला आदेश या निष्पादन योग्य नहीं (एक स्रोत फ़ाइल में या सिंटेक्स त्रुटि) ...
killall myScriptकाम करता है, इसलिए हत्यारे की वापसी (और स्क्रिप्ट का नहीं!) है 0. आप एकkill -x $$[x सिग्नल संख्या होने के नाते रख सकते हैं , और $$ आमतौर पर उस स्क्रिप्ट के PID में शेल द्वारा विस्तारित किया जाता है (श, बैश में काम करता है,) ...)] स्क्रिप्ट के अंदर और फिर परीक्षण करें कि इसका निकास कोर क्या था।