Bash

跳過陷阱中的“自然”出口

  • September 9, 2016

我的腳本看起來像:

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以檢查最後一個命令(將是退出的返回碼,或腳本末尾的命令)的返回碼為零。IE

trap '[ $? = 0 ] && exit;'"..."

你目前的字元串在哪裡"...",後面應該沒有空格。陷阱內的出口不會再次陷入陷阱。

如果您的陷阱也在處理信號,例如 SIGINT (control-C),那麼陷阱會為 SIGINT 呼叫一次,然後再為退出呼叫一次。您可能可以檢查是否從 SIGINT 呼叫陷阱,因為$?將是 128+n,其中 n 是信號,因此 SIGINT 為 130。記住$?將在您發出另一個命令後立即更改,因此也許從rc=$?;then開始$rc在您的測試中使用。

引用自:https://unix.stackexchange.com/questions/233292