还原:如何克服 Linux 上的 ksh 与 Linux 上的 ksh 之间的不兼容性安装在 AIX/Solaris/HPUX 上吗?

StackOverflow https://stackoverflow.com/questions/96133

在我们将数百个 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 所有平台都兼容吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top