sh 中带有 `set -e` 和子 shell 的奇怪行为

Weird behavior in sh with `set -e` and a subshell

如果我删除子 shell,下面的代码将打印 Continuing。 使用子 shell,如果我想进入 Continuing 部分,我需要在测试后再次成功调用(使用 : 作为成功的无操作命令是最直接的,IMO)。

#!/bin/sh
set -e #Exit on untested error
( #Subshell
    #Some succesfful commands go here
    #And here comes a file test
    [ -f "doesntExist" ] && {
        : #Irrelevant
    }
    #: 
)
echo Continuing

这种行为是否正确?为什么引入子 shell 会改变

的行为
[ -f "doesntExist" ] && {
      : 
}

我正在使用 dash 0.5.7-2ubuntu2 到 运行 这个。

这是意料之中的。 set -e 忽略 AND 列表中的非零退出状态,但不忽略子 shell 中的非零退出状态。两者的区别

set -e
[ -f "doesntExist" ] && {
    : #Irrelevant
}
echo Continuing

set -e
( [ -f "doesntExist" && { : ; } )
echo Continuing

是在前者中,你的脚本看到一个非零退出状态的 AND 列表,但在后者中它看到一个非零退出状态的子 shell。