我参与了将包含数百个 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 上,输出为“flag = true”,在 Linux 上,输出为“flag = false”。
我的问题是:
- 是否可以设置一个环境变量来让 Linux 的 ksh 表现得像其他操作系统的一样?做不到这一点:
- 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 先前接受的答案。