我希望在我的Bash脚本中进行清理操作,如下所示:
#! /bin/bash
set -eu
trap 'echo "E: failed with exitcode $?" 1>&2' ERR
true
false
使用$?
作为一种自然选择,但事实并非如此。它始终包含0
。有什么方法可以“窥探”ERR
陷阱中的exitcode吗?
[更新:] 我不知道我之前测试过的是什么。这段代码就像一个魅力,所以我把它留在这里作为一个小而好的例子。
答案 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
陷阱 紧跟until
或while
关键字后的命令列表, 在if
或elif
保留字之后的部分测试 命令在&&
或||
列表中执行,或者命令的返回状态 正在使用!
反转。这些是遵守的相同条件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