#!/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之后。
谁能解释一下,为什么会这样?
设置-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 不会退出,但最后一个&&
或之后的命令除外||