#!/bin/bash -eu
items="1 2"
for item in $items; do
(
echo one
false
echo two
) ||:
done
我希望false
行打破子shell,但继续处理外部循环。即预期的产出是
one
one
然而,我得到了
one
two
one
two
好像||:
正好位于false
行之后,而不是在子shell之后。
任何人都可以解释,为什么会发生这种情况?
答案 0 :(得分:2)
在子shell中设置-e
并删除||:
:
#!/bin/bash -u
items="1 2"
for item in $items; do
(
set -e
echo one
false
echo two
)
done
另一种看似有效的方法是:
#!/bin/bash -eu
items="1 2"
for item in $items; do
(
echo one
false
echo two
) | awk '{print}'
done
我认为您的方法不起作用的原因如下(引自man bash
):
如果失败的命令是
&&
或||
列表中执行的任何命令的一部分,那么shell不会退出,除了最后&&
之后的命令或||