¿Qué significa `[EXPRESIÓN], [] y [OPCIÓN` en` prueba de hombre`?

8

Examinando man test, veo que bajo la sinopsis de testson las posibilidades test EXPRESSIONy test.

¿Qué [ EXPRESSION ], [ ] and [OPTIONsignifica a continuación?

¿Por qué están vacíos los soportes y por qué se [OPTIONpierde un soporte? ¿Alguien puede interpretar esto por mí?

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION
Shuzheng
fuente

Respuestas:

10

[es otro nombre para test. Las tres líneas son líneas de comando que se ejecutan testcon algunas opciones.

En la primera línea, esta es una prueba estándar: [ 5 -gt 4 ]es lo mismo que test 5 -gt 4.

En el segundo, se omite la expresión, lo que significa salir de false ( 0 arguments: Exit false (1)).

Para el tercer caso, supongo que está utilizando GNU coreutils. En GNU, testel texto de ayuda contiene esta nota:

NOTE: [ honors the --help and --version options, but test does not.
test treats each of those as it treats any other nonempty STRING.

Esta es una extensión que no es POSIX ; La motivación parece ser que testse requiere para tratar esos argumentos como cadenas como cualquier otro. [es capaz de distinguir el caso de opción del caso de cadena por la presencia del ]corchete de cierre .

Tenga en cuenta que su shell probablemente proporcionará el suyo [, por lo que tendrá /bin/\[que usar esta versión.

Michael Homer
fuente
4

[es lo mismo que testuna concha incorporada en algunas conchas.

Si mira más abajo man test, describe cuáles son los válidos con los EXPRESSIONque puede probar:

Una EXPRESIÓN omitida por defecto es falsa. De lo contrario, EXPRESSION es verdadero o falso y establece el estado de salida. Es uno de: ...

Esto puede no ser evidente para vosotros desde la página de manual, pero en algunos otros más viejos / conchas, tanto [y testestán disponibles como comandos reales, lo que significa el espacio que se ve en [ EXPRESSION ]es obligatoria para EXPRESSIONser aceptado como un argumento para [/ test. Por lo tanto, incluso para las cáscaras que los ofrecen como un paquete integrado, conservan este formato por compatibilidad.

Y como se explica en la respuesta de @ dr01 mientras escribo esto, el corchete derecho es opcional.

hjk
fuente
@don_crissti gracias por el aviso, creo que simplemente omitiré esa última oración ...
hjk
0

[ OPTION Realmente no le falta un soporte.

De hecho, quizás sorprendentemente, [es un comando (ubicado en /usr/bin/[) equivalente a test. Por lo tanto, (al menos en teoría) se le permitió usar solo el corchete izquierdo, con el corchete derecho sirviendo solo como azúcar sintáctica. Sin embargo, las nuevas versiones de shell lo requieren .

Dr_
fuente
¿Hay otras diferencias entre estas que testno se pueden usar con una opción (no incluida en esa posibilidad)?
Shuzheng
1
Se no permite omitir el soporte derecho, ya sea en POSIX o GNU [.
Michael Homer
@MichaelHomer Sí. Corregido
dr_
No estoy seguro de qué tiene que ver Bash con esto ...
Michael Homer
1
@MichaelHomer, en POSIX, el comportamiento si omite el corchete correcto no se especifica, por lo que no se permite que un script POSIX omita el ], pero un POSIX [puede hacer lo que quiera, incluso llamarlo y reiniciar la máquina o imprimir un mensaje de ayuda si lo llamas sin eso Eso permite GNU grep's [ --version. test --versiony, [ --version ]sin embargo, deben devolver verdadero (prueba de --versionser la cadena no vacía) y no mostrar nada.
Stéphane Chazelas