当前位置:  开发笔记 > 编程语言 > 正文

如何克服Linux上的ksh与AIX/Solaris/HPUX上安装的ksh之间的不兼容性?

如何解决《如何克服Linux上的ksh与AIX/Solaris/HPUX上安装的ksh之间的不兼容性?》经验,为你挑选了1个好方法。

我参与了将包含数百个ksh脚本的系统从AIX,Solaris和HPUX移植到Linux的过程.我在ksh在两个系统上的行为方式遇到了以下不同之处:

#!/bin/ksh
flag=false
echo "a\nb" | while read x
do
    flag=true
done
echo "flag = ${flag}"
exit 0

在AIX,Solaris和HPUX上,Linux上的输出为"flag = true",输出为"flag = false".

我的问题是:

是否有一个环境变量,我可以设置为让Linux的ksh表现得像其他Os的'?失败了:

Linux的ksh上有选项可以获得所需的行为吗?失败了:

是否有适用于Linux的ksh实现具有所需的行为?

其他说明:

在AIX上,Solaris和HPUX ksh是ksh88的变体.

在Linux上,ksh是公共域ksh(pdksh)

在AIX上,Solaris和HPUX dtksh和ksh93(我安装它们)与ksh一致

我可以访问的Windows NT系统:Cygwin和MKS NT,与Linux一致.

在AIX,Solaris和Linux上,bash是一致的,给出了不正确的(从我的角度来看)"flag = false"的结果.

下表总结了系统问题:

uname -s       uname -r                   which ksh          ksh version                     flag =
========       ========                   =========          ===========                     ======
Linux          2.6.9-55.0.0.0.2.ELsmp     /bin/ksh           PD KSH v5.2.14 99/07/13.2       false
AIX            3                          /bin/ksh           Version M-11/16/88f             true    // AIX 5.3
                                          /bin/ksh93         Version M-12/28/93e             true
SunOS          5.8, 5.9 and 5.10          /bin/ksh           Version M-11/16/88i             true
                                          /usr/dt/bin/dtksh  Version M-12/28/93d             true
HP-UX          B.11.11 and B.11.23        /bin/ksh           Version 11/16/88                true
                                          /usr/dt/bin/dtksh  Version M-12/28/93d             true
CYGWIN_NT-5.1  1.5.25(0.156/4/2)          /bin/ksh           PD KSH v5.2.14 99/07/13.2       false
Windows_NT     5                          .../mksnt/ksh.exe  Version 8.7.0 build 1859...     false    // MKS
更新

在我公司的人员提出一些建议后,我们决定对代码进行以下修改.无论是使用"真实"ksh(ksh88,ksh93)还是任何ksh克隆(pdksh,MSK ksh),这都给出了相同的结果.这也适用于bash.

#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
    flag=true
done < junk
echo "flag = ${flag}"
exit 0

感谢jj33以前接受的答案.



1> jj33..:

不要在linux上使用pdksh,而是使用kornshell.org中的"real"ksh.pdksh是对ksh的盲目重新实现.kornshell.org是可以追溯到25年左右的原始korn shell(由David Korn编写的).AIX和Solaris使用原始ksh的版本,因此kornshell.org版本通常是功能和错误完成的.在使用SunOS/Solaris时,安装kornshell.org ksh通常是我在新Linux机器上做的第一件事......

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有