我有一系列命令,我想以这样的方式运行:当任何命令失败时,其余命令不应再执行。我们假设命令序列是
echo foo
false
echo bar
(即,我希望foo
得到回应,但不希望得到回应bar
)。
这应该发生在使用 运行的脚本中set -e
,我不如果上述命令序列失败,则希望完全失败。我最初的想法是使用子shell
( echo foo ; false ; echo bar ; ) || true
但这不起作用,两者foo
都bar
被打印,因为根据 POSIX 规范,set -e
在 的左侧失去了作用||
,与条件内相同if
(我认为规范的这一部分在概念上是有缺陷的,因为它破坏了抽象,但哦,好吧,现在不改变 POSIX 规范)。set -e
括号内的显式也无法解决此问题。
我也无法解决set +e ... set -e
这部分问题,因为|| true
我想运行一些可能失败并导致脚本失败的替代命令。 (除此之外,通过显式set
命令恢复状态很丑陋。)
因此,我似乎只能在事后进行set +e
显式检查$?
,或者将命令序列作为单独的脚本运行(在单独的文件中或通过bash <<EOF ...
),其缺点是无法访问(数组)变量容易地。
坦率地说,这似乎是一个相当常规的用例,+e
用作条件的表达式左侧的隐式和强制变得不成比例且令人惊讶地困难。我缺少任何简单的选择吗?
答案1
如果您想运行一系列命令直到第一次失败:
$ command1 && command2 && command3 && command4
&&
当且仅当左侧的命令返回零退出代码时,令牌才会执行右侧的命令。