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
ที่ดำเนินการรอและการจัดการทางออกแบบมีส่วนร่วมของเทอร์มินัลอินเตอร์รัปต์ ดังนั้นคุณอาจต้องการให้แน่ใจว่าได้ฆ่าตัวเองด้วยสัญญาณเดียวกันเพื่อรายงานต่อผู้ปกครองว่าคุณถูกขัดจังหวะและควรพิจารณาออกจากตัวเองเช่นกันหากได้รับ SIGINT / SIGQUIT
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