ERR
जाल उस कोड को चलाने के लिए नहीं है जब शेल स्वयं एक शून्य-शून्य त्रुटि कोड के साथ बाहर निकलता है, लेकिन जब कोई भी कमांड उस शेल से चलता है जो एक शर्त का हिस्सा नहीं है (जैसे if cmd...
, या cmd || ...
...) एक गैर-शून्य के साथ बाहर निकलता है बाहर निकलने की स्थिति ( set -e
शेल से बाहर निकलने के कारणों के समान स्थिति )।
यदि आप गैर-शून्य निकास स्थिति के साथ शेल से बाहर निकलने पर कोड चलाना चाहते हैं, तो आपको EXIT
इसके बजाय एक जाल जोड़ना चाहिए और $?
वहां जांच करनी चाहिए :
trap '[ "$?" -eq 0 ] || echo hi' EXIT
ध्यान दें कि एक फंसे सिग्नल पर, सिग्नल ट्रैप और EXIT ट्रैप दोनों चलाए जाएंगे, इसलिए आप इसे करना चाहते हैं:
unset killed_by
trap 'killed_by=INT;exit' INT
trap 'killed_by=TERM;exit' TERM
trap '
ret=$?
if [ -n "$killed_by" ]; then
echo >&2 "Ouch! Killed by $killed_by"
exit 1
elif [ "$ret" -ne 0 ]; then
echo >&2 "Died with error code $ret"
fi' EXIT
या $((signum + 128))
संकेतों पर बाहर निकलने की स्थिति का उपयोग करने के लिए :
for sig in INT TERM HUP; do
trap "exit $((128 + $(kill -l "$sig")))" "$sig"
done
trap '
ret=$?
[ "$ret" -eq 0 ] || echo >&2 "Bye: $ret"' EXIT
हालांकि ध्यान दें कि SIGINT या SIGQUIT पर सामान्य रूप से बाहर निकलने पर संभावित कष्टप्रद दुष्प्रभाव होते हैं जब आपकी मूल प्रक्रिया एक ऐसा शेल होता है bash
जो टर्मिनल रुकावट के प्रतीक्षा और सहकारी निकास हैंडलिंग को लागू करता है । इसलिए, आप अपने माता-पिता को सूचित करने के बजाय उसी संकेत के साथ खुद को मारना सुनिश्चित कर सकते हैं ताकि आप वास्तव में बाधित हो गए थे, और यह कि खुद को बाहर निकालने पर विचार करना चाहिए, अगर यह एक संकेत / हस्ताक्षर प्राप्त हुआ।
unset killed_by
for sig in INT QUIT TERM HUP; do
trap "exit $((128 + $(kill -l "$sig"))); killed_by=$sig" "$sig"
done
trap '
ret=$?
[ "$ret" -eq 0 ] || echo >&2 "Bye: $ret"
if [ -n "$killed_by" ]; then
trap - "$killed_by" # reset handler
# ulimit -c 0 # possibly disable core dumps
kill -s "$killed_by" "$$"
else
exec "$ret"
fi' EXIT
यदि आप चाहते हैं कि ERR
जाल में आग लग जाए, तो बस एक गैर-शून्य निकास स्थिति जैसे false
या के साथ एक कमांड चलाएं test
।