结合使用 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
考虑以下 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