Definição da função Shell: por que há um espaço após a chave de abertura?

Definição da função Shell: por que há um espaço após a chave de abertura?

Você provavelmente sabe dissobomba de garfo:

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

Eu me pergunto por que é necessário, para análise, incluir um espaço após a chave de abertura.

Responder1

{}

          { list; }

Colocar uma lista de comandos entre chaves faz com que a lista seja executada no contexto atual do shell. Nenhum subshell é criado. O ponto e vírgula (ou nova linha) da lista a seguir é obrigatório.

Além da criação de um subshell, há uma diferença sutil entre essas duas construções por motivos históricos. As chaves são palavras reservadas, portanto 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 sejam separados da lista por espaços em branco.

//fonte

Responder2

Acho que @rush pode estar dando uma resposta correta, embora enganosa, aqui. A bomba-garfo define umfunçãochamado " :". O código entre chaves não é executado até que a função seja chamada pelo " :" final. Então as chaves comoagrupamento de comandose as chaves comocorpo funcionalsão sintaticamente iguais, mas têm semânticas diferentes.
Do mesmodocumentocomo @rush cita:

Observe que, por razões históricas, no uso mais comum, as chaves que circundam o corpo da função devem ser separadas do corpo por espaços em branco ou novas linhas. Isso ocorre porque as chaves são palavras reservadas e só são reconhecidas como tal quando são separadas da lista de comandos por um espaço em branco ou outro metacaractere do shell. Além disso, ao usar colchetes, a lista deve terminar com ponto e vírgula, '&' ou nova linha.

informação relacionada