cmd && echo "$?"यह तब तक काम नहीं करेगा, जब यह केवल जीरो प्रिंट echoकरेगा ( केवल पूर्ववर्ती कमांड के सफल समापन पर निष्पादित होगा)।
यहां आपके लिए एक छोटा शेल फ़ंक्शन दिया गया है:
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
यह दिए गए कमांड के एक्जिट कोड को उसी तरह प्रिंट timeकरता है जैसे कमांड करता है।
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
पुनः निर्देशित करके printfकरने के लिए /dev/ttyसमारोह में, हम अभी भी उपयोग कर सकते हैं tellexitहमारे मानक उत्पादन या त्रुटि धाराओं में कबाड़ हो रही बिना पुनर्निर्देशन के साथ:
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
एक चर में निकास कोड को सहेजकर हम इसे कॉलर को वापस करने में सक्षम हैं:
$ tellexit false || echo 'failed'
exit code 1
failed
उसी फ़ंक्शन का एक कट्टर संस्करण भी संकेत को प्रिंट करता है जो कमांड को मार देता है यदि निकास कोड 128 से अधिक है (जिसका अर्थ है कि यह सिग्नल के कारण समाप्त हो गया है):
tellexit () {
"$@"
local err="$?"
if [ "$err" -gt 128 ]; then
printf 'exit code\t%d (%s)\n' "$err" "$(kill -l "$err")" >/dev/tty
else
printf 'exit code\t%d\n' "$err" >/dev/tty
fi
return "$err"
}
परिक्षण:
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
( localबात की आवश्यकता है ash/ pdksh/ bash/ zsh, या आप इसे बदल सकते हैं, typesetजिसे कुछ अन्य गोले भी समझ सकते हैं।)
sleep 1 && echo $?स्लीपर सेल का कोड तभी प्रिंट होगा जब यह शून्य हो ...