Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 条件执行时ksh errexit_Shell_Unix_Ksh_Openbsd - Fatal编程技术网

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版本获取适当的维护更改日志,并将其与报告问题的修补程序所在的版本进行比较,但我找不到,难怪它不再维护

但在my
MacOSX
sh(AT&T Research)93u+2012-08-01上的最新
ksh93
版本上也一样,完全按照您的预期运行脚本

+ [ 1 '==' 1 ]
+ [ 2 '==' 1 ]
+ false

建议升级您的ksh版本以供进一步研究,因为您的版本已经过时且容易出错,或者如果您仍想报告,假设对此有积极的支持,您可以访问本节“bug”部分中提到的邮件列表。

我相信这已在-current中修复


虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能会无效。由于第一个答案是邮件列表存档,第二个答案是官方源代码日志,所以这种情况极不可能发生:^)不过,谢谢您提供的信息-我会记住这一点。