And*_*ein 5 linux aix ksh solaris
我参与了将包含数百个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
Run Code Online (Sandbox Code Playgroud)
在AIX,Solaris和HPUX上,Linux上的输出为"flag = true",输出为"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
Run Code Online (Sandbox Code Playgroud)
在我公司的人员提出一些建议后,我们决定对代码进行以下修改.无论是使用"真实"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
Run Code Online (Sandbox Code Playgroud)
感谢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机器上做的第一件事......
在听取了公司人员的一些建议后,我们决定对代码进行以下修改。无论是使用“真正的”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
Run Code Online (Sandbox Code Playgroud)
感谢 jj33 之前接受的答案。