考虑命令
eval false || echo ok
echo also ok
通常,我们希望它能够执行该false
实用程序,并且由于退出状态为非零,因此可以执行echo ok
和echo also ok
。
在所有的类POSIX我用贝壳(ksh93
,zsh
,bash
,dash
,OpenBSD的ksh
,和yash
),这是发生了什么,但事情变得有趣的,如果我们能set -e
。
如果set -e
有效,则执行时,OpenBSD sh
和ksh
shell(均从派生pdksh
)将终止脚本eval
。没有其他外壳可以做到这一点。
POSIX说特殊的内置实用程序(例如eval
)中的错误应导致非交互式外壳终止。我不确定执行是否false
构成“错误”(如果确实如此,它将独立于set -e
活动状态)。
解决此问题的方法似乎是将eval
in 放在子shell中,
( eval false ) || echo ok
echo also ok
问题是,是否应该在POSIX正确的shell脚本中执行此操作,还是在OpenBSD的shell中出现错误?另外,上面链接到的POSIX文本中的“错误”是什么意思?
额外的信息:OpenBSD Shell将 在命令中echo ok
使用和不使用两者set -e
eval ! true || echo ok
我的原始代码看起来像
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
这将不输出not ok
与string=false
使用OpenBSD的炮弹(它会终止),我不知道它是通过设计,错误或误会,还是其他什么东西。
eval false
即使脚本是AND-OR列表或条件语句的一部分,您是否也希望终止该脚本?我不会
set -e
设置了正确的行为...我同意不终止于条件语句是有意义的。
set -e
所以`()是答案。
eval false
生成非零状态,因此我希望set -e
在那时终止脚本。在!
set -e
不适用as!
语句的情况下,显式检查退出状态。