考虑代码:
set -ex
for a in 1 2 3; do
[ $a == 1 ] || false
done
预期输出为:
+ [ 1 == 1 ]
+ [ 2 == 1 ]
+ false
但是我得到了:
+ [ 1 == 1 ]
+ [ 2 == 1 ]
+ false
+ [ 3 == 1 ]
+ false
出于某种原因,ksh决定在第二次迭代后false
之后不退出。
通过bash运行此脚本可提供预期的结果。
有趣的是,我可以通过将代码更改为:
来说服ksh提供预期的结果set -ex
for a in 1 2 3; do
[ $a == 1 ] || false
true
done
从表面上看,我所做的只是添加一个true
命令,该命令应该无效。
我的ksh版本(OpenBSD 6.0的默认版本)是:@(#)PD KSH v5.2.14 99/07/13.2
我想确保在我决定将此报告为错误之前没有找到我想要的东西。
答案 0 :(得分:2)
我不会把它作为bug提交,让我们现在看看一些历史。
当前现有的Korn
shell版本是
JM 93u 2011-02-08
,那么你有
ksh93
。 @(#)PD KSH v5.2.14 99/07/13.2
,那么你
有pdksh (Public Domain Korn Shell)
。@(#)MIRBSD KSH R49 2014/01/11
,那么你
有mksh (MirBSD Korn Shell)
。根据此消息来源,您的ksh
版本属于第二类
pdksh是公共领域 Korn shell,是Korn Shell的克隆版。它具有大部分ksh88功能,几乎没有ksh93功能。从1999年7月13日开始,最后一个版本 pdksh 5.2.14 仍有几个漏洞。 Debian,OpenBSD和PLD等系统现在将几个补丁应用于
pdksh
。
所以难怪您的 ksh 版本已经过时了,我尝试为您的shell版本获取正确的维护更改日志,并将其与您报告的问题的修补程序和我的版本进行比较无法找到它,难怪它不再被维护。
但在ksh93
上的最新MacOSX
版本, sh (AT&T Research) 93u+ 2012-08-01
上也是如此,运行您的脚本完全符合预期,
+ [ 1 '==' 1 ]
+ [ 2 '==' 1 ]
+ false
建议升级您的 ksh 版本以供进一步研究,因为您的版本已经过时且容易出错,或者如果您仍想要报告,假设是否有积极的支持,您可以转到此pdksh(1) - Linux man page的错误部分中提到的邮件列表。
答案 1 :(得分:0)