首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何克服Linux上的ksh与AIX/Solaris/HPUX上安装的ksh之间的不兼容性?

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

Stack Overflow用户
提问于 2008-09-16 16:43:05
回答 8查看 19.1K关注 0票数 6

我参与了将包含数百个ksh脚本的系统从AIX、Solaris和HPUX移植到Linux的过程。我发现ksh在这两个系统上的行为方式有以下不同:

代码语言:javascript
复制
#!/bin/ksh
flag=false
echo "a\nb" | while read x
do
    flag=true
done
echo "flag = ${flag}"
exit 0

在AIX、Solaris和HPUX上,输出在Linux上是“标志=真”,输出是“标志=假”。

我的问题是:

  • 是否有一个环境变量,可以设置为使Linux的ksh能够像其他Os的那样运行?如果做不到这一点:
  • Linux的ksh上是否有获得所需行为的选项?如果做不到这一点:
  • 是否有一个具有所需行为的Linux可用的ksh实现?

其他说明:

  • 在AIX上,Solaris和HPUX是ksh88的一个变体。
  • 在Linux上,ksh是公共域ksh (pdksh)。
  • 在AIX上,Solaris和HPUX和ksh93 (安装它们的地方)与ksh是一致的。
  • 我可以访问的Windows系统: Cygwin和MKS与Linux是一致的。
  • 在AIX、Solaris和Linux上,bash是一致的,给出了不正确的(在我看来)结果为“标志=假”。

下表总结了系统存在的问题:

代码语言:javascript
复制
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 ),这都会给出相同的结果。这也适用于bash。

代码语言:javascript
复制
#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
    flag=true
done < junk
echo "flag = ${flag}"
exit 0

感谢jj33先前接受的答案。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-09-18 18:22:36

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

代码语言:javascript
复制
#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
    flag=true
done < junk
echo "flag = ${flag}"
exit 0

感谢jj33之前接受的答案。

票数 3
EN

Stack Overflow用户

发布于 2008-09-16 16:51:28

与其在linux上使用pdksh,不如使用来自kornshell.org的“真正”ksh。pdksh是ksh的盲重实现。kornshell.org是起源于25年前的kornshell.org(由David编写)。AIX和Solaris使用原始ksh的版本,因此kornshell.org版本通常是功能完整的和bug完成的。在使用SunOS/Solaris时,安装kornshell.org ksh通常是我在新Linux上做的第一件事。

票数 7
EN

Stack Overflow用户

发布于 2008-09-16 17:25:08

我在本地Ubuntu系统上安装了'ksh‘和'pdksh’。

代码语言:javascript
复制
ii  ksh            93s+20071105-1 The real, AT&T version of the Korn shell
ii  pdksh          5.2.14-21ubunt A public domain version of the Korn shell

ksh具有您期望的“正确”行为,而pdksh则没有。您可以检查本地Linux发行版的软件存储库,以获得“真正的”ksh,而不是使用pdksh。“真正的Unix”操作系统将安装AT&T版本的Korn shell,而不是pdksh,默认情况下,它们基于AT&T Unix (System ) :-)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档