如何在bash脚本中捕获代码退出代码
题
我的bash代码中有很多出口点。我需要在出口上进行一些清理工作,因此我使用陷阱为这样的出口添加了回调:
trap "mycleanup" EXIT
问题是有不同的出口代码,我需要做相应的清理工作。我可以在myCleanup中获得退出代码吗?
解决方案
我想你可以使用 $?
获取退出代码。
其他提示
接受的答案基本上是正确的,我只想澄清事情。
以下示例效果很好:
#!/bin/bash
cleanup() {
rv=$?
rm -rf "$tmpdir"
exit $rv
}
tmpdir="$(mktemp)"
trap "cleanup" INT TERM EXIT
# Do things...
但是,如果没有功能,则必须更加小心。例如,这行不通:
trap "rv=$?; rm -rf $tmpdir; exit $rv" INT TERM EXIT
相反,您必须逃脱 $rv
和 $?
变量:
trap "rv=\$?; rm -rf $tmpdir; exit \$rv" INT TERM EXIT
您可能还想逃脱 $tmpdir
, ,当陷阱线被执行时,它将对其进行评估,以及 tmpdir
稍后的价值变化将不会给您预期的行为。
编辑:使用 ShellCheck 要检查您的bash脚本并注意这样的问题。
我发现最好将出口陷阱与其他信号的陷阱分开
示例陷阱测试脚本...
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
基本上,只要您不使用出口陷阱中的“退出”,它将在保留原始退出值的情况下退出。
除了:请注意出口陷阱中的引用。这使我可以更改脚本寿命中需要清理的文件。在尝试删除$ TMPFILE之前,我通常还包括一个测试,因此我什至不需要在脚本开始时就设置它,而只是在创建它之前。
不隶属于 StackOverflow