7

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

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

true
false

使用$?是一种自然的选择,但事实并非如此。它总是包含0. 有什么方法可以“窥探”ERR陷阱中的退出代码吗?

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

4

1 回答 1

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

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

如果sigspecERR,则只要简单命令具有非零退出状态,就会执行命令arg ,但须符合以下条件。如果失败的命令是紧跟or关键字的命令列表的一部分、紧跟or关键字的测试的一部分、在or列表中执行的命令的一部分,或者如果命令的返回状态正在反转,ERR则不执行陷阱使用. 这些是选项遵循的相同条件 。untilwhileifelif&&||!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
于 2013-09-30T10:24:54.510 回答