2

在我们将数百个 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 上是否有获得所需行为的选项?
4

4 回答 4

5

我不会再在 Linux 上使用 pdksh 了。由于 AT&T ksh 已成为开源,因此各种 Linux 发行版都提供了软件包。例如,RedHat Enterprise Linux 和 CentOS 包含 ksh93 作为“ksh”RPM 软件包。

pdksh 仍然在软件供应商的许多安装要求文档中被提及。我们用 ksh93 替换了我们所有 Linux 系统上的 pdksh,到目前为止没有任何问题。

于 2008-12-23T16:19:17.083 回答
0

您确实意识到 [ 是 的别名(通常是链接,符号或硬链接)/usr/bin/test,对吗?所以也许实际的问题是不同版本的/usr/bin/test?

OTOH,ksh 用内置函数覆盖它。也许有办法让它不这样做?/usr/bin/test或者,如果/usr/bin/test在所有平台上都兼容,也许您可​​以明确地将 [ 别名为 ?

于 2008-09-18T20:55:17.070 回答
0

一年后,我的问题似乎没有解决方案。

我添加这个答案是为了说我将不得不忍受它......

于 2009-09-17T14:49:42.577 回答
0

在 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 内置测试允许草率的代码。

于 2010-04-26T06:58:58.763 回答