我参与了将包含数百个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上是“标志=真”,输出是“标志=假”。
我的问题是:
其他说明:
下表总结了系统存在的问题:
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。
#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
flag=true
done < junk
echo "flag = ${flag}"
exit 0感谢jj33先前接受的答案。
发布于 2008-09-18 18:22:36
在我公司的人提出一些建议后,我们决定对代码做如下修改。无论是使用“真实”ksh (ksh88,ksh93)还是使用任何ksh克隆(pdksh,MSK ),这都会给出相同的结果。这也适用于bash。
#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
flag=true
done < junk
echo "flag = ${flag}"
exit 0感谢jj33之前接受的答案。
发布于 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上做的第一件事。
发布于 2008-09-16 17:25:08
我在本地Ubuntu系统上安装了'ksh‘和'pdksh’。
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 shellksh具有您期望的“正确”行为,而pdksh则没有。您可以检查本地Linux发行版的软件存储库,以获得“真正的”ksh,而不是使用pdksh。“真正的Unix”操作系统将安装AT&T版本的Korn shell,而不是pdksh,默认情况下,它们基于AT&T Unix (System ) :-)。
https://stackoverflow.com/questions/74372
复制相似问题