Definición de la función Shell: ¿por qué hay un espacio después de la llave de apertura?


18

Probablemente sepas de esa bomba tenedor :

 :(){ :|:&};: #WARNING: harmful code

Me pregunto por qué es necesario, para analizar, incluir un espacio después de la llave de apertura.

Respuestas:


13

{}

          { list; }

Colocar una lista de comandos entre llaves hace que la lista se ejecute en el contexto actual del shell. No se crea ninguna subshell. Se requiere la siguiente lista de punto y coma (o nueva línea).

Además de la creación de una subshell, existe una sutil diferencia entre estas dos construcciones debido a razones históricas. Las llaves son palabras reservadas, por lo que deben estar separadas de la lista por espacios en blanco u otros metacaracteres de shell. Los paréntesis son operadores y el shell los reconoce como tokens separados, incluso si no están separados de la lista por espacios en blanco.

// fuente


1
He objetado su respuesta en mi propia publicación en esta página. Es una función, no una agrupación de comandos.
donothings exitosamente

3
@donothingsuccessfully Un cuerpo de función es una agrupación de comandos.
Gilles 'SO- deja de ser malvado'

3

Creo que @rush puede estar dando una respuesta correcta si es engañosa aquí. La bomba tenedor define una función llamada " :". El código entre llaves no se ejecuta hasta que la función es llamada por el " :" final . Por lo tanto, las llaves como agrupación de comandos y las llaves como cuerpo de la función son sintácticamente iguales pero tienen una semántica diferente.
Del mismo documento que @rush cita:

Tenga en cuenta que, por razones históricas, en el uso más común, las llaves que rodean el cuerpo de la función deben estar separadas del cuerpo por espacios en blanco o líneas nuevas. Esto se debe a que las llaves son palabras reservadas y solo se reconocen como tales cuando están separadas de la lista de comandos por espacios en blanco u otro metacarácter de shell. Además, cuando se usan llaves, la lista debe terminar con un punto y coma, un '&' o una nueva línea.


3
No, la respuesta de rush es correcta. Las llaves alrededor del cuerpo de una función son el mismo elemento sintáctico que cuando no están delimitadas por un cuerpo de función. Consulte las reglas de gramática de shell : a function_bodyes a compound_command(más un opcional redirect_list). El espacio es necesario porque {es una palabra reservada, no un carácter especial.
Gilles 'SO- deja de ser malvado'

Sí, la respuesta de rush es correcta, como dije. Sí, son sintácticamente iguales, como dije. Pero brace_groups se comportan de manera diferente cuando forman parte de una función y cuando no. Estaba usando la agrupación de comandos para describir el último caso y esto es lo que se describió en el enlace de rush.
donothings exitosamente

2
No estoy seguro de que la distinción semántica sea significativa aquí, ya que es la sintaxis lo que le importa al analizador. La respuesta real {no es un operador, sino una palabra reservada, y las palabras deben separarse de otras palabras para que se las considere distintas.
jw013
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.