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。
如果我删除子 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。