【问题标题】:REDUX: How to overcome an incompatibility between the ksh on Linux vs. that installed on AIX/Solaris/HPUX?REDUX:如何克服 Linux 上的 ksh 与 AIX/Solaris/HPUX 上安装的 ksh 之间的不兼容问题?
【发布时间】:2010-09-10 21:38:06
【问题描述】:
在我们将数百个 ksh 脚本从 AIX、Solaris 和 HPUX 移植到 Linux 的过程中,我发现了另一个问题。上一个问题见here。
这段代码:
#!/bin/ksh
if [ -a k* ]; then
echo "Oh yeah!"
else
echo "No way!"
fi
exit 0
(在包含多个名称以 k 开头的文件的目录中运行时)会产生“哦,是的!”当使用 AT&T ksh 变体(ksh88 和 ksh93)调用时。另一方面,它会产生错误消息,然后是“没办法!”在其他 ksh 变体(pdksh、MKS ksh 和 bash)上。
再次,我的问题是:
- 是否有环境变量会导致 pdksh 表现得像 ksh93?做不到这一点:
- pdksh 上是否有获得所需行为的选项?
【问题讨论】:
标签:
linux
solaris
ksh
aix
hp-ux
【解决方案1】:
您确实意识到 [ 是/usr/bin/test 的别名(通常是符号链接或硬链接),对吗?所以也许实际的问题是/usr/bin/test 的不同版本?
OTOH,ksh 用内置函数覆盖它。也许有办法让它不这样做?或者,如果所有平台上的/usr/bin/test 都兼容,您可以明确地将 [ 别名为/usr/bin/test?
【解决方案2】:
在 Bash 中, test -a 操作是针对单个文件的。
我猜在 Ksh88 中 test -a 操作是针对单个文件的,但没有抱怨,因为其他测试词是 -a 的未指定条件。
你想要类似的东西
for K in /etc/rc2.d/K* ; do test -a $K && echo heck-yea ; done
我可以说 ksh93 在这方面就像 bash 一样工作。
很遗憾,我认为代码写得不好,我的意见,而且可能是一个不好的意见,因为问题的根本原因是 ksh88 内置测试允许草率的代码。
【解决方案3】:
一年后我的问题似乎没有解决办法。
我添加这个答案是为了说我将不得不忍受它......
【解决方案4】:
我不会再在 Linux 上使用 pdksh。
由于 AT&T ksh 已成为开源,因此各种 Linux 发行版都提供了软件包。例如。 RedHat Enterprise Linux 和 CentOS 包含 ksh93 作为“ksh”RPM 包。
pdksh 仍然在软件供应商的许多安装要求文档中被提及。我们用 ksh93 替换了我们所有 Linux 系统上的 pdksh,到目前为止没有任何问题。