Bash set -e 无法按预期工作(我明白)

  • 本文关键字:工作 我明白 set Bash bash
  • 更新时间 :
  • 英文 :

#!/bin/bash
set -exuo pipefail
# Run delorean to update the namespaces folder
main() {
if [ !$(yq -r '.random' file_that_doesnt_exist.yaml) = "true" ]; then
echo "yes"
else
echo "no"
fi
}
# shellcheck disable=SC2068
main $@

根据我的理解,set -e pipefail应该在第一次出现错误时退出bash脚本。然而,我得到的却是"不"。在stdout中,echo "no"发生在错误之后。这是怎么发生的?

set -e在出现错误时停止脚本,但并非总是如此:

如果失败的命令是紧跟在whileuntil关键字后面的命令列表的一部分,ifelif保留字后面的测试的一部分,&&||列表中执行的任何命令的一部分(最后一个&&||后面的命令),管道中的任何命令(最后一个命令),或者如果命令的返回值与!相反,则shell不会退出。

(引自man bash)。

基本上,不要使用-e(或者至少不要只使用)。
使用trap,并仔细设计您的测试。

出口。这一整页都是关于替代方案和解释的好的讨论,而这一页是一些其他的例子和阐述,应该给你一个更好的解决方案的好灵感。

相关内容

最新更新