单方括号[
和test
命令都内置在 bash shell 中。
如果方括号[
和test
命令具有相同的功能,为什么会有两个单独的命令?
答案1
[
和test
是相同的命令。只是,[
期望它的最后一个参数是]
(否则它会忽略)。
[
和命令test
通常由同一个二进制文件实现。大多数类似 Bourne 的 shellfish
都内置有[
和test
。 C shell 或rc
它们的衍生物则没有。 C shell 有专用的结构来执行通常由test
/实用程序执行的一些操作[
。
该test
命令与当时新的 Bourne shell 一起出现在 70 年代末的 Unix V7 中。以前的版本没有test
命令,并且它们的 shell 没有if
构造。但有一个独立if
命令它可以执行一些相同的测试,test
并根据结果执行命令。
Bourne shell 引入了一些控制语句 ( if
// ),因此引入while
它是为了补充它,以便有一个可在这些语句的条件部分中使用的命令来执行各种测试。until
test
V7中没有[
命令,但是你可以找到一些未完成的 注释掉代码那里有一个[
内置程序,表明他们当时已经设想了它,但sh
当时可能决定不用它来扰乱代码。
[
并将test
内置函数添加到 Bourne shell1981年进入系统III。
从那时起,所有类似 Bourne 的 shellbash
都内置了[
/ ,但请注意,虽然 Almquist shell 从一开始就有/内置(实际上与 合并),但它最初在早期的 BSD 中被禁用(未编译),直到完全禁用。有些迟到了。test
[
test
expr
两者[
和test
都是标准 POSIX 命令。它们不需要是内置的,但需要可以从env
、find -exec
、execvp()
等中执行,因此可以作为独立的可执行文件使用。
您仍然会发现一些系统提供独立的test
实用程序,但不是[
一个。这解释了为什么您更经常看到以下内容:
find . -exec test -f {} ';'
(相当于 GNUfind
的-xtype f
),比:
find . -exec [ -f {} ] ';'
这在不提供独立[
实用程序的系统上会失败。
[
作为和之间的另一个轶事差异test
,因为test <any-string>
(与 相同[ <any-string> ]
) 是一个有效的测试,用于测试是否<any-string>
为非空,test --version
或者test --help
无法返回 的版本test
或其用法。[ --version
但这不是一个有效的测试,因此您会发现 GNU 独立[
实用程序接受--version
并--help
分别返回版本和使用信息,而不是通常的missing ‘]’
错误消息,而 GNUtest
则不接受(请参阅2003 年的相应提交(误导性评论2005年修复))。
$ '/usr/bin/[' --version
[ (GNU coreutils) 8.30
[...]
$ /usr/bin/test --version && echo "--version is non-empty"
--version is non-empty
$ '/usr/bin/[' --something-else
/usr/bin/[: missing ‘]’