Na maioria dos casos, [
é um shell embutido e é equivalente a test
. No entanto, como test
, ele também existe como um executável autônomo: esse é o /bin/[
que você viu. Você pode testar isso com type -a [
(em um sistema Arch Linux, executando bash
):
$ type -a [
[ is a shell builtin
[ is /bin/[
Portanto, no meu sistema, eu tenho dois [
: meu shell embutido e o executável em /bin
. O executável está documentado em man test
:
TEST(1) User Commands TEST(1)
NAME
test - check file types and compare values
SYNOPSIS
test EXPRESSION
test
[ EXPRESSION ]
[ ]
[ OPTION
DESCRIPTION
Exit with the status determined by EXPRESSION.
[ ... ]
Como você pode ver no trecho da página man acima, test
e [
são equivalentes. Os comandos /bin/[
e /bin/test
são especificados por POSIX e é por isso que você encontrará eles apesar do fato de que muitas conchas também os fornecem como builtins. Sua presença garante que construções como:
[ "$var" -gt 10 ] && echo yes
funcionará mesmo se o shell que os executa não tiver [
incorporado. Por exemplo, em tcsh
:
> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ] && echo yes
yes