还原:如何克服 Linux 上的 ksh 与 Linux 上的 ksh 之间的不兼容性安装在 AIX/Solaris/HPUX 上吗?
题
在我们将数百个 ksh 脚本从 AIX、Solaris 和 HPUX 移植到 Linux 的过程中,我发现了另一个问题。看 这里 对于之前的问题。
这段代码:
#!/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 上是否有一个选项可以获取所需的行为?
解决方案 2
一年后,我的问题似乎没有解决。
我添加这个答案是为了表示我将不得不忍受它......
其他提示
我不会再在 Linux 上使用 pdksh 了。由于 AT&T ksh 已成为开源,因此可以从各种 Linux 发行版中获取软件包。例如。RedHat Enterprise Linux 和 CentOS 包含 ksh93 作为“ksh”RPM 软件包。
许多软件供应商的安装要求文档中仍然提到 pdksh。我们用 ksh93 替换了所有 Linux 系统上的 pdksh,到目前为止没有出现任何问题。
在 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 内置测试允许草率的代码。
您确实意识到 [ 是别名(通常是链接,符号链接或硬链接) /usr/bin/test
, , 正确的?所以也许实际的问题是不同的版本 /usr/bin/test
?
OTOH,ksh 用内置函数覆盖它。也许有办法让它不这样做?或者也许您可以显式将 [ 别名为 /usr/bin/test
, , 如果 /usr/bin/test
所有平台都兼容吗?