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

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

Probablemente sepas de esobomba de tenedor:

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

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

Respuesta1

{}

          { list; }

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

Además de la creación de una subcapa, 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 del 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

Respuesta2

Creo que @rush puede estar dando una respuesta correcta aunque engañosa aquí. La bomba-tenedor define unfunciónllamado " :". El código entre llaves no se ejecuta hasta que la función es llamada por el " :" final. Entonces las llaves comoagrupación de comandosy las llaves comocuerpo funcionalson sintácticamente iguales pero tienen diferente semántica.
Del mismodocumentocomo cita @rush:

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 nuevas líneas. Esto se debe a que las llaves son palabras reservadas y sólo se reconocen como tales cuando están separadas de la lista de comandos por espacios en blanco u otro metacarácter del shell. Además, cuando se utilizan llaves, la lista debe terminar con un punto y coma, un '&' o una nueva línea.

información relacionada