[英]How to trap exit code in Bash script
我的 bash 代碼中有很多退出點。 我需要在退出時做一些清理工作,所以我使用陷阱為退出添加回調,如下所示:
trap "mycleanup" EXIT
問題是退出代碼不同,我需要做相應的清理工作。 我可以在 mycleanup 中獲得退出代碼嗎?
接受的答案基本上是正確的,我只是想澄清一下。
以下示例運行良好:
#!/bin/bash
cleanup() {
rv=$?
rm -rf "$tmpdir"
exit $rv
}
tmpdir="$(mktemp)"
trap "cleanup" EXIT
# Do things...
但是,如果在沒有函數的情況下進行內聯清理,則必須更加小心。 例如,這將不起作用:
trap "rv=$?; rm -rf $tmpdir; exit $rv" EXIT
相反,您必須逃避$rv
和$?
變量:
trap "rv=\$?; rm -rf $tmpdir; exit \$rv" EXIT
您可能還想轉義$tmpdir
,因為它將在執行陷阱行時進行評估,並且如果tmpdir
值稍后更改,則可能不會給出預期的行為。
編輯:使用shellcheck檢查您的 bash 腳本並注意此類問題。
我認為您可以使用$?
獲取退出代碼。
我發現最好將 EXIT 陷阱與其他信號的陷阱分開
示例陷阱測試腳本...
umask 77
tmpfile=`tmpfile.$$`
trap 'rm -f "$tmpfile"' EXIT
trap 'exit 2' HUP INT QUIT TERM
touch $tmpfile
read -r input
exit 10
臨時文件被清理。 文件退出值 10 被保留! 中斷導致退出值為 2
基本上只要您不在 EXIT 陷阱中使用“exit”,它就會在保留原始退出值的情況下退出。
旁白:注意 EXIT 陷阱中的引用。 這讓我可以更改腳本生命周期內需要清理的文件。 在嘗試刪除 $tmpfile 之前,我還經常測試它是否存在,因此我什至不需要在腳本的開頭設置它,只需要在創建它之前。
以下代碼運行良好。 您可以存儲退出代碼並在陷阱函數中定義每個退出代碼所需的命令。
#!/bin/bash
trap cleanup EXIT
cleanup() {
exit_code=$?
if [[ ${exit_code} -eq 1 ]]; then
# command 1
elif [[ ${exit_code} -eq 2 ]]; then
# command 2
elif [[ ${exit_code} -eq 3 ]]; then
# command 3
fi
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.