Bash
跳過陷阱中的“自然”出口
我的腳本看起來像:
trap "$(pwd)/dd-destroy.sh $l-env;$(pwd)/dd-drop.sh $l-db;exit" INT QUIT TERM EXIT ./dd-all.sh $l $l-db $l-env || exit 1 app_ip=$(./dd-status.sh ip $l-env|grep docker-app|awk '{print $3}') url=http://$app_ip:8080/app/ wget -O /dev/null $url || (echo "access $url failed" && false) || exit 1
現在我希望在發生錯誤時啟動這個陷阱,那些“退出 1”(我可以在那裡更改它們)。但是當什麼都沒有發生時,就像 dd-all.sh 工作正常,當 wget 很好時。我不想呼籲毀滅。
我可以用陷阱完成這個嗎?這不是我的劇本,我需要稍微改變一下。也許陷阱在這裡是一個壞電話?
只需更改您的開始
trap
以檢查最後一個命令(將是退出的返回碼,或腳本末尾的命令)的返回碼為零。IEtrap '[ $? = 0 ] && exit;'"..."
你目前的字元串在哪裡
"..."
,後面應該沒有空格。陷阱內的出口不會再次陷入陷阱。如果您的陷阱也在處理信號,例如 SIGINT (control-C),那麼陷阱會為 SIGINT 呼叫一次,然後再為退出呼叫一次。您可能可以檢查是否從 SIGINT 呼叫陷阱,因為
$?
將是 128+n,其中 n 是信號,因此 SIGINT 為 130。記住$?
將在您發出另一個命令後立即更改,因此也許從rc=$?;
then開始$rc
在您的測試中使用。