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.
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:
{}
{ 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
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.
function_body
es a compound_command
(más un opcional redirect_list
). El espacio es necesario porque {
es una palabra reservada, no un carácter especial.
brace_group
s 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.
{
no es un operador, sino una palabra reservada, y las palabras deben separarse de otras palabras para que se las considere distintas.