2
#!/bin/bash -eu

items="1 2"
for item in $items; do
(
    echo one
    false
    echo two
) ||:
done

我希望false线打破一个子壳,但继续处理外循环。即预期的输出是

one
one

但是,我得到

one
two
one
two

好像||:正好false在行之后,而不是在子shell之后。

谁能解释一下,为什么会这样?

4

1 回答 1

2

设置-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):

&&如果失败的命令是在 a or||列表中执行的任何命令的 [...] 一部分,则 shell 不会退出,但最后一个&&或之后的命令除外||

于 2013-05-16T11:41:49.050 回答