yang ERR
perangkap tidak untuk menjalankan kode ketika shell itu sendiri keluar dengan nol non kode kesalahan, tetapi ketika perintah dijalankan oleh shell yang yang bukan merupakan bagian dari kondisi (seperti di if cmd...
, atau cmd || ...
...) keluar dengan non-zero status keluar (kondisi yang sama seperti apa yang menyebabkan set -e
shell keluar).
Jika Anda ingin menjalankan kode saat keluar dari shell dengan status keluar non-nol, Anda harus menambahkan jebakan EXIT
dan periksa di $?
sana:
trap '[ "$?" -eq 0 ] || echo hi' EXIT
Namun perhatikan bahwa pada sinyal yang terperangkap, perangkap sinyal dan perangkap EXIT akan dijalankan, jadi Anda mungkin ingin melakukannya seperti:
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
Atau untuk menggunakan status keluar seperti $((signum + 128))
pada sinyal:
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
Namun perlu dicatat bahwa keluar secara normal pada SIGINT atau SIGQUIT memiliki potensi efek samping yang mengganggu ketika proses induk Anda adalah shell seperti bash
yang mengimplementasikan penanganan tunggu dan keluar secara kooperatif terhadap interupsi terminal. Jadi, Anda mungkin ingin memastikan untuk bunuh diri dengan sinyal yang sama sebagai gantinya untuk melaporkan kepada orang tua Anda bahwa Anda memang terganggu, dan bahwa itu harus mempertimbangkan untuk keluar dengan sendirinya jika menerima 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
Jika Anda ingin ERR
jebakan terbakar, jalankan saja perintah dengan status keluar yang tidak nol seperti false
atau test
.