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

Kev*_*vin 15 linux command-line utilities coreutils test

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

Mik*_*kel 7

源代码解释的差异为如何处理的--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.  */
Run Code Online (Sandbox Code Playgroud)

示范

$ /usr/bin/test --help
$
$ /usr/bin/[ --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.
[...]
Run Code Online (Sandbox Code Playgroud)

bash内置版本中,唯一的区别是最后[需要],如您所说。

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

Bil*_*hor 6

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

除了调用格式的不同外,它们都提供相同的功能。

  • 令人惊讶的是,在 Debian 的 coreutils 中,它们不是同一个二进制文件。同一个源代码被编译两次,一次将 PROGRAM_NAME 定义为“test”,另一次将其定义为“[”,并使用一些额外的代码来测试表达式是否以“]”结尾。o_o (8认同)
  • @angus 另一个例子是 ls/dir/vdir。Coreutils 似乎喜欢构建不同的硬编码二进制文件,而不是在运行时测试 argv[0]。 (3认同)