考虑命令
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和kshshell(均从派生pdksh)将终止脚本eval。没有其他外壳可以做到这一点。
POSIX说特殊的内置实用程序(例如eval)中的错误应导致非交互式外壳终止。我不确定执行是否false构成“错误”(如果确实如此,它将独立于set -e活动状态)。
解决此问题的方法似乎是将evalin 放在子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!语句的情况下,显式检查退出状态。