`test`和`[`-不同的二进制文件,有什么区别吗?


13

我在回答另一个问题时注意到test[它们是不同的二进制文件,但是[联机帮助页拉起了test。除了要求结尾],还有什么区别吗?如果不是,为什么它们将二进制文件分开而不是符号链接?(它们也是bash内置的,bash也没有区别。)

Answers:


4

源代码解释的差异为如何处理的--help选项。

  /* Recognize --help or --version, but only when invoked in the
     "[" form, when the last argument is not "]".  Use direct
     parsing, rather than parse_long_options, to avoid accepting
     abbreviations.  POSIX allows "[ --help" and "[ --version" to
     have the usual GNU behavior, but it requires "test --help"
     and "test --version" to exit silently with status 0.  */

示范

$ /usr/bin/test --help
$
$ /usr/bin/[ --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.
[...]

如您所说bash,在内置版本中,唯一的不同是最后[需要]


1
有趣的是,尽管大多数程序都通过符号链接实现了相同的行为。
凯文

1
它们是与我系统上相同inode的硬链接。与符号链接相比,这样做的好处是,如果符号链接目标被删除或移动,则符号链接将不再起作用。如果到inode的硬链接之一被移动或删除,则所有硬链接将继续工作。
没人

5

通常,它们是具有硬链接的相同二进制文件。取决于外壳,内部实现可以用于test[测试,而不是二进制。就生成过程而言,这是更有效的方法,并且可以提供与二进制程序test提供的选项不同的选项。

除了呼叫格式的差异外,它们都提供相同的功能。


7
足够令人惊讶的是,在Debian的coreutils中,它们不是同一二进制文件。相同的源代码被编译两次,一次将PROGRAM_NAME定义为“ test”,另一次将其定义为“ [”,并使用一些其他代码来测试表达式以“]”结尾。o_O
安格斯

3
@angus另一个例子是ls / dir / vdir。Coreutils似乎喜欢构建不同的硬编码二进制文件,而不是在运行时测试argv [0]。
Random832 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.