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

Rol*_*lig 6 bash shell exit-code bash-trap

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

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

true
false
Run Code Online (Sandbox Code Playgroud)

使用$?脑海作为一种自然选择,但事实并非如此.它总是包含0.有什么方法可以"窥探" ERR陷阱中的exitcode 吗?

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

dev*_*ull 5

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

+ set -eu
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR
+ true
+ false
++ echo 'E: failed with exitcode 1'
E: failed with exitcode 1
Run Code Online (Sandbox Code Playgroud)

有可能返回的命令ERR在 a&&或 中执行||,或者受以下代码段中提到的其他条件的约束。引用手册

如果sigspecERR,则只要简单命令具有非零退出状态,就会执行命令arg,但须符合以下条件。的ERR,如果失败的命令是紧接着的命令列表的一部分不执行陷阱untilwhile关键字,以下的测试的一部分ifelif保留字,在执行的命令的一部分&&||列表,或者命令的返回状态被倒置使用!. 这些是errexit选项遵守的相同条件 。

因此,例如,如果您有以下情况:

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

false && true
Run Code Online (Sandbox Code Playgroud)

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

+ set -eu
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR
+ false
Run Code Online (Sandbox Code Playgroud)