结合使用 bash 错误处理选项(例如 pipefail、errexit、inherit_errexit)

combined use of bash options for error handling (e.g. pipefail, errexit, inherit_errexit)

考虑以下 Bash 脚本:

#!/usr/bin/env bash

set -o errexit pipefail
shopt -s inherit_errexit

( echo hello ; exit 1 ) | cat

echo world

运行版本5.0.17,输出如下:

hello
world

然而,负责打印 hello 的子 shell 会失败,退出状态为非零。管道的一部分,启用选项 pipefail,整个管道应该同样失败,具有相同的状态(管道中的后续项目当然会自行返回零状态)。因此,管道应该评估为非零状态,由于 errexit(如果不是 inherit_errexit)将提示脚本立即终止,而不会到达最终语句打印 world .

可以看出,没有达到最终打印语句的预测不准确。

为什么?

您只是在设置 errexit 设置,而不是 pipefail-o后面不能放多个选项,需要重复-o选项。其他所有内容都被放入位置参数中。

所以改变

set -o errexit pipefail

set -o errexit -o pipefail