Shell 条件执行时ksh errexit
以代码为例:Shell 条件执行时ksh errexit,shell,unix,ksh,openbsd,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运行此脚本可以获得预期的结果 有趣的是,我可以通过将代码更改为: set -ex for
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运行此脚本可以获得预期的结果
有趣的是,我可以通过将代码更改为:
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
在我决定将此报告为bug之前,我想确保我没有遗漏任何东西。我不会将其作为bug提交,现在让我们看看一些历史记录 当前现有的
Korn
shell版本为
- 如果输出看起来像JM 93u 2011-02-08版本,那么您有 . 李>
- 如果输出看起来像
,那么 有@(#)PD KSH v5.2.14 99/07/13.2
- 如果输出看起来像
,那么 有@(#)MIRBSD KSH R49 2014/01/11
ksh
版本属于第二类,根据该消息来源所述
pdksh是Kornshell的公共域,是Korn shell的克隆。它具有ksh88的大部分功能,而ksh93几乎没有任何功能。1999年7月13日发布的最新版本pdksh 5.2.14仍然有几个bug。像Debian、OpenBSD和PLD这样的系统现在为pdksh
应用了几个补丁
因此,难怪您的ksh版本已经过时,我尝试为您的shell版本获取适当的维护更改日志,并将其与报告问题的修补程序所在的版本进行比较,但我找不到,难怪它不再维护
但在myMacOSX
,sh(AT&T Research)93u+2012-08-01上的最新ksh93
版本上也一样,完全按照您的预期运行脚本
+ [ 1 '==' 1 ]
+ [ 2 '==' 1 ]
+ false
建议升级您的ksh版本以供进一步研究,因为您的版本已经过时且容易出错,或者如果您仍想报告,假设对此有积极的支持,您可以访问本节“bug”部分中提到的邮件列表。我相信这已在-current中修复
虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能会无效。由于第一个答案是邮件列表存档,第二个答案是官方源代码日志,所以这种情况极不可能发生:^)不过,谢谢您提供的信息-我会记住这一点。