在“陷阱退出”中获取shell脚本的exitcode

时间:2013-09-30 10:07:08

标签: bash shell exit-code bash-trap

我希望在我的Bash脚本中进行清理操作,如下所示:

#! /bin/bash
set -eu
trap 'echo "E: failed with exitcode $?" 1>&2' ERR

true
false

使用$?作为一种自然选择,但事实并非如此。它始终包含0。有什么方法可以“窥探”ERR陷阱中的exitcode吗?

[更新:] 我不知道我之前测试过的是什么。这段代码就像一个魅力,所以我把它留在这里作为一个小而好的例子。

1 个答案:

答案 0 :(得分:3)

您的(可能是简化的)示例没有显示您提到的问题:

+ set -eu
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR
+ true
+ false
++ echo 'E: failed with exitcode 1'
E: failed with exitcode 1

返回ERR的命令可能会在&&||中执行,或者受到下面代码段中提到的其他条件的影响。引自manual

  

如果 sigspec ERR,只要简单就执行命令 arg   命令具有非零退出状态,具体取决于以下内容   条件。如果失败的命令是部分,则不执行ERR陷阱   紧跟untilwhile关键字后的命令列表,   在ifelif保留字之后的部分测试   命令在&&||列表中执行,或者命令的返回状态   正在使用!反转。这些是遵守的相同条件   errexit选项。

因此,如果您有以下内容:

#! /bin/bash
set -eu
trap 'echo "E: failed with exitcode $?" 1>&2' ERR

false && true

执行它不会导致失败被困:

+ set -eu
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR
+ false