bash 上的方括号和 test 命令有什么区别?

bash 上的方括号和 test 命令有什么区别?

单方括号[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它是为了补充它,以便有一个可在这些语句的条件部分中使用的命令来执行各种测试。untiltest

V7中没有[命令,但是你可以找到一些未完成的 注释掉代码那里有一个[内置程序,表明他们当时已经设想了它,但sh当时可能决定不用它来扰乱代码。

[并将test内置函数添加到 Bourne shell1981年进入系统III

从那时起,所有类似 Bourne 的 shellbash都内置了[/ ,但请注意,虽然 Almquist shell 从一开始就有/内置(实际上与 合并),但它最初在早期的 BSD 中被禁用(未编译),直到完全禁用。有些迟到了。test[testexpr

两者[test都是标准 POSIX 命令。它们不需要是内置的,但需要可以从envfind -execexecvp()等中执行,因此可以作为独立的可执行文件使用。

您仍然会发现一些系统提供独立的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 ‘]’

相关内容