make -e只从子shell退出

时间:2013-05-16 11:18:07

标签: bash shell subshell

#!/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之后。

任何人都可以解释,为什么会发生这种情况?

1 个答案:

答案 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不会退出,除了最后&&之后的命令或||