【问题标题】: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,到目前为止没有任何问题。

          【讨论】:

            猜你喜欢
            • 2010-09-09
            • 2018-04-16
            • 2012-04-30
            • 2013-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-21
            • 1970-01-01
            相关资源
            最近更新 更多