AIX上的ksh是否违反POSIX.1-2004和POSIX.1-2008?

时间:2015-03-05 18:26:09

标签: shell posix aix

我将以下shell脚本保存在名为foo.sh的文件中。

username=$1
if [ -n "$username" ]
then
    echo username: "$username"
fi

我在AIX 5.3机器上运行此脚本。

$ echo $SHELL
/usr/bin/ksh
$ sh foo.sh humpty
username: humpty
$ sh foo.sh =
foo.sh[2]: test: 0403-004 Specify a parameter with this command.
$ ksh foo.sh =
foo.sh[2]: test: 0403-004 Specify a parameter with this command.
$ ksh93 foo.sh =
username: =
$ bash foo.sh =
username: =

如果您想了解版本。

$ ksh93 -c 'echo ${.sh.version}'
Version M-12/28/93e
$ bash --version
GNU bash, version 3.2.16(1)-release (powerpc-ibm-aix5.2.0.0)
Copyright (C) 2005 Free Software Foundation, Inc

我找不到确定ksh版本的方法。

如您所见,当我指定ksh作为输入时,脚本会导致=出错。我可以在AIX 5.3上使用ksh重现此错误,但在AIX 5.3上不能使用bash或ksh93重现此错误。也许,当AIX上的ksh看到[ -n = ]时,它期望它是对两个相同字符串的测试。

是否违反POSIX.1-2004以及POSIX.1-2008的ksh行为? http://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html处的文件清楚地说明了这一点。

  

确定运算符优先级的算法   应生成的返回值基于数量   参加测试的论据。 (但是,当使用" [...]"表格时,   右括号最终论证不计算在内   算法。)

     

在以下列表中,$ 1,$ 2,$ 3和$ 4表示参数   提交测试:

     

0个参数:   退出false(1)。

     

1个论点:   如果$ 1不为null,则退出true(0);否则,退出false。

     

2个论点:

     
      
  • 如果$ 1是'!',如果$ 2为空,则退出true,如果$ 2不为空则退出。

  •   
  • 如果$ 1是一元主要,如果一元测试为真,则返回true,false   如果一元测试是假的。

  •   
  • 否则,产生未指定的结果。

  •   

在这种情况下,[ -n = ]确实有2个参数,第一个参数确实是一元一次,因此它应该测试=是非零字符串并退出true而不是抛出错误。

0 个答案:

没有答案