我发现了另外一个问题,我们正努力将数百个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)。
同样,我的问题是:
答案 0 :(得分:5)
我不再在Linux上使用pdksh了。 由于AT& T ksh已经成为OpenSource,因此可以从各种Linux发行版中获得软件包。例如。 RedHat Enterprise Linux和CentOS包含ksh93作为“ksh”RPM包。
软件供应商的许多安装要求文档中仍然提到了pdksh。我们用ksh93替换了所有Linux系统上的pdksh,到目前为止没有任何问题。
答案 1 :(得分:0)
你确实认识到[{1}}的[别名(通常是链接,象征性或硬性),对吧?那么实际问题可能是/usr/bin/test
的不同版本?
OTOH,ksh用内置版覆盖它。也许有办法让它不这样做?或者,如果所有平台上的/usr/bin/test
兼容,您可以明确别名[到/usr/bin/test
吗?
答案 2 :(得分:0)
一年之后,我的问题似乎无法解决。
我添加这个答案,说我将不得不忍受......
答案 3 :(得分:0)
在Bash中,测试-a操作是针对单个文件的。
我猜测在Ksh88中测试-a操作是针对单个文件的,但不会抱怨,因为其他测试字是-a的未指定条件。
你想要像
这样的东西for K in /etc/rc2.d/K* ; do test -a $K && echo heck-yea ; done
我可以说ksh93在这方面就像bash一样。 遗憾的是,我认为代码编写得很糟糕,我的意见,并且可能是一个不好的意见,因为问题的根本原因是ksh88内置测试允许草率代码。