[El comando devuelve el estado de salida cero si la expresión, contenida en sus argumentos, se considera verdadera y el estado de salida distinto de cero si la expresión, contenida en sus argumentos, se considera falsa. También falla con el mensaje de error si su último argumento no lo es ](esto se hace únicamente por razones estéticas).
P.ej:
[ hello ]
echo "Exit-status of [ hello ] is:" $?
[ abc = abc ]
echo "Exit-status of [ abc = abc ] is:" $?
[ ]
echo "Exit-status of [ ] is:" $?
[ abc = def ]
echo "Exit-status of [ abc = def ] is:" $?
... dará salida:
El estado de salida de [hola] es: 0 - porque la cadena no vacía se considera verdadera
El estado de salida de [abc = abc] es: 0 - porque 'abc' realmente es lo mismo que 'abc'
El estado de salida de [] es : 1 - porque la cadena vacía se considera falsa
El estado de salida de [abc = def] es: 1 - porque 'abc' realmente difiere de 'def'
Sin embargo, bash y muchos otros shells generalmente no invocan /bin/[(o /usr/bin/[) en estos casos, sino que llaman al comando incorporado con exactamente el mismo comportamiento (solo por razones de rendimiento). Para invocar /bin/[(no el sustituto incorporado del shell) debe especificar explícitamente su ruta (p /bin/[ hello ].] Ej ., No necesita prefijar con dirname aunque ☺ ), o configurar el shell para que no use un sustituto incorporado (por ejemplo, enable -n [en bash).
PD: Como se dijo en otras respuestas, [está relacionado con test. Pero test, a diferencia [, no requiere ]como último argumento (y no lo espera en absoluto; agregar más ]a los testargumentos puede hacer que falle con un mensaje de error o que devuelva un resultado incorrecto) . El /bin/testy /bin/[puede resolverse en el mismo archivo (p. Ej., Uno está enlazado a un enlace simbólico ; en este caso, el desvío de comportamiento probablemente se implementa analizando el comando actualmente llamado dentro del propio código test/ [) o en diferentes archivos. Para test, el shell también generalmente invoca un sustituto incorporado, a menos que la ruta se especifique explícitamente ( /bin/test) o esté configurada para no hacerlo (enable -n test)
PPS: a diferencia de testy [, moderno ifnunca es un archivo real. Es parte de la sintaxis de shell (por ejemplo, bash): if commandA; then commandB; fi(se pueden usar nuevas líneas en lugar de punto y coma) hace commandBque se ejecute si y solo si commandAsale con estado cero. Esto se adapta perfectamente al comportamiento de testo [, lo que permite combinarlos como if [ "$a" = foo ]; then …; fi (o if test "$a" = foo; then …; fi, simplemente, menos legibles) . Sin embargo, los scripts modernos a menudo usan en [[lugar de testo [, que (como el if) nunca es un archivo real, sino que siempre es parte de la sintaxis de shell.
PPPS: En cuanto a man, nunca espere mantener un artículo sobre cada comando en su sistema de archivos. Información sobre algo de información (incluso "real", basada en archivos) comandos pueden faltar, en algunos shell empotrados puede estar presente no sólo en un artículo dedicado a la cáscara específica (que es el lugar en el que sin duda encontrará información sobre test, [, if, [[). Aún así, muchas distribuciones tienen artículos explícitos manpara testy [. (Acerca de --help, no se reconoce testpor razones obvias: necesita manejar en silencio casos como a=--help; test "$a"; en algunas distribuciones [ --help(sin cerrar ]) todavía muestra ayuda, en algunos no lo hace).
[refiere altestcomando, noexpr, así que debería serloman test