关于条件执行的ksh errexit

时间:2017-01-12 13:54:35

标签: shell unix ksh openbsd

考虑代码:

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

我想确保在我决定将此报告为错误之前没有找到我想要的东西。

2 个答案:

答案 0 :(得分:2)

我不会把它作为bug提交,让我们现在看看一些历史。

当前现有的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)