我的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之前,我通常还包括一个测试,因此我什至不需要在脚本开始时就设置它,而只是在创建它之前。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top