¿Cuál es el identificador de token de `]`?

9

Bash Manual dice:

Cuando se utiliza el [formulario, el último argumento para el comando debe ser a].

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Entonces, ]no es una palabra reservada, ni es un operador, ni es un comando incorporado.

Como token, ¿cuál es el identificador de token ]? ¿PALABRA o NOMBRE?

Tim
fuente
44
En realidad, [es (también) un comando autosuficiente: -rwxr-xr-x 1 root root 39552 3 de diciembre 18:14 / usr / bin / [Aunque es posible que también haya una función "paralela" incorporada, como la hay para por ejemplo kill. En algunos sistemas, el testcomando es un enlace simbólico [o viceversa. AFAIK, ]no significa nada en sí mismo, pero se acepta "cerrar" a [, pero es más por razones "estéticas".
Baard Kopperud
55
El lenguaje shell ha crecido capa por capa en los últimos 46 años, y la consistencia interna nunca fue una prioridad. Si intenta forzarlo en cualquier tipo de marco teórico de lenguaje formal, lo pasará mal.
zwol
Como [es (también) un comando autónomo, generalmente tiene una página de manual ... Así que intente man [y / o man test( [y testpuede ser el mismo comando).
Baard Kopperud
Intente pegar las ]comillas simples o dobles y verá que no hay diferencia; Es solo una cuerda.
Comodín el

Respuestas:

21

]Complementos [, es el signo de [mando de cierre .

Como manseñala la página, esto es realmente un argumento para [, pero [resulta tratarlo especialmente, como el final.

Puede parecerse a él con algunos otros patrones de cierre de comandos, por ejemplo ;en find .. exec.

heemayl
fuente
Gracias. ¿Cuál es el tipo / identificador de token de ]?
Tim
8
@Tim ]no es diferente de cualquier otro personaje normal en este contexto (como argumento para un comando). El testcomando lo trata especialmente, pero eso depende del comando.
Muru
66
Es solo una cadena y [genera un error si su argumento final no es exactamente igual a ].
chepner
19

Bash no trata los caracteres [o ](por sí solos) de manera diferente a una letra del alfabeto.

En este caso, bash ve una "palabra" [, y busca un comando con ese nombre. Si observa su sistema de archivos, probablemente encontrará que /bin/[(o /usr/bin/[) existe como un archivo ejecutable. De hecho, bash también proporciona una versión integrada (en aras de la eficiencia), pero eso es solo un detalle de implementación.

El [comando (como en, el ejecutable con ese nombre), tiene una regla de que el último parámetro que debe pasar es ]o de lo contrario arroja un error. Esto puede deberse en parte a que es estéticamente agradable, pero también sirve para protegerlo de comandos truncados accidentalmente, lo cual es bueno.

El hecho de que estos no sean especiales es la razón por la que no puede omitir el espacio en blanco antes y después de [o ].


Excepciones :

  • Cuando [y ]ocurra en el formato correcto dentro de la misma palabra, por ejemplo [a-z], eso es especial y se aplican las reglas globales de bash.
  • El [[comando es especial y puede hacer muchas cosas [que no puede (y los parámetros en el interior [[ .. ]]se procesan de manera diferente, al igual que algunos saltos de línea). El correspondiente ]]también es especial, ya que es una palabra reservada de shell que no puede ser un nombre de comando y finaliza el procesamiento especial que sigue a la [[palabra clave.
ams
fuente
1
@JacobKrall No es un personaje especial como ;o >, es solo un comando incorporado como cd. En particular, si escribe [x, el [no tiene un significado especial.
Barmar
2
@JacobKrall Eso es cierto para todos los comandos integrados. [es un comando especial , no es un personaje especial .
Barmar
@ Barmar: bastante justo; Retraigo mis comentarios.
Jacob Krall
En realidad ]]es más especial que ]. Cuando se usan [y ]son solo palabras. Si lo omitió ]o lo reemplazó con una palabra diferente, bash seguirá ejecutándose [, pero [producirá un error. Sin embargo [[y ]]son tratados especiales en el momento del análisis. Si lo reemplazó ]]con algo más, bash informará un error de sintaxis. Y si omite ]]bash, seguiría analizando la siguiente línea buscando el ]].
kasperd
@kasperd respuesta ajustada.
enms.
3

Para decirlo de manera más simple que las dos respuestas anteriores, ]es solo una cadena que [requiere ejecutarse.

Kenny
fuente
1
Esto parece un poco como un comentario ...
wizzwizz4
@ wizzwizz4, dadas las preguntas de seguimiento del OP en los comentarios, creo que esta simplicidad es exactamente lo que necesitaba.
Comodín
@Wildcard Estoy de acuerdo. Había algo que me tentaba a votar esta respuesta, pero pensé que era de baja calidad. (¡Sin embargo, no voté en contra!) Voy a editar para mejorar el marcado.
wizzwizz4