REDUX:如何克服Linux上的ksh与AIX / Solaris / HPUX上安装的ksh之间的不兼容?

时间:2020-03-06 14:23:08  来源:igfitidea点击:

在将数百个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)一起调用时。另一方面,它会生成并显示错误消息,然后显示" No way!"。在其他ksh变体(pdksh,MKS ksh和bash)上。

同样,我的问题是:

  • 是否有一个环境变量会导致pdksh的行为类似于ksh93?失败:
  • pdksh上是否有一个选项可以获取所需的行为?

解决方案

我们确实意识到[是/ usr / bin / test的别名(通常是符号链接或者硬链接),对吗?因此,实际的问题可能是不同版本的/ usr / bin / test吗?

OTOH,ksh用内置的方法覆盖它。也许有办法让它不要那样做?或者,如果在所有平台上的/ usr / bin / test是兼容的,我们也可以显式地别名[到/ usr / bin / test

一年后,似乎无法解决我的问题。

我添加这个答案是说我将不得不忍受……

在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内置测试允许松散代码。