Você provavelmente conhece essa bomba de garfo :
:(){ :|:&};: #WARNING: harmful code
Eu me pergunto por que é necessário, para analisar, incluir um espaço após a chave de abertura.
Você provavelmente conhece essa bomba de garfo :
:(){ :|:&};: #WARNING: harmful code
Eu me pergunto por que é necessário, para analisar, incluir um espaço após a chave de abertura.
Respostas:
{}
{ list; }
Colocar uma lista de comandos entre chaves faz com que a lista seja executada no contexto atual do shell. Nenhum subshell é criado. É necessário o ponto e vírgula (ou nova linha) a seguir.
Além da criação de um subshell, há uma diferença sutil entre esses dois constructos devido a razões históricas. Os chavetas são palavras reservadas; portanto, elas devem ser separadas da lista por espaços em branco ou outros metacaracteres do shell. Os parênteses são operadores e são reconhecidos como tokens separados pelo shell, mesmo que não estejam separados da lista por espaços em branco.
// origem
Acho que @rush pode estar dando uma resposta correta, se enganosa aqui. O fork-pump define uma função chamada " :
". O código entre chaves não é executado até que a função seja chamada pelo final " :
". Portanto, os chavetas como agrupamento de comandos e as chavetas como corpo da função são sintaticamente iguais, mas têm semânticas diferentes.
Do mesmo documento que o @rush cita:
Observe que, por razões históricas, no uso mais comum, os chavetas que envolvem o corpo da função devem ser separados do corpo por espaços em branco ou novas linhas. Isso ocorre porque os chavetas são palavras reservadas e são reconhecidas apenas como tais quando são separadas da lista de comandos por espaços em branco ou outro metacaractere de shell. Além disso, ao usar os chavetas, a lista deve ser encerrada por ponto e vírgula, um '&' ou uma nova linha.
function_body
é a compound_command
(mais um opcional redirect_list
). O espaço é necessário porque {
é uma palavra reservada, não um caractere especial.
brace_group
se comportam de maneira diferente quando fazem parte de uma função e quando não. Eu estava usando o agrupamento de comandos para descrever o último caso e foi o que foi descrito no link do rush.
{
é que não é um operador, mas uma palavra reservada, e as palavras precisam ser separadas de outras palavras para serem consideradas distintas.