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


18

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:


13

{}

          { 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


11
Eu brinquei com sua resposta em meu próprio post nesta página. É uma função, não um agrupamento de comandos.
precisa saber é o seguinte

3
@donothingsuccessfully Um corpo de função é um agrupamento de comandos.
Gilles 'SO- stop be evil'

3

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.


3
Não, a resposta do rush está correta. As chaves em volta do corpo de uma função são o mesmo elemento sintático de quando não estão delimitadas. Veja as regras gramaticais do shell : a function_bodyé a compound_command(mais um opcional redirect_list). O espaço é necessário porque {é uma palavra reservada, não um caractere especial.
Gilles 'SO- stop be evil'

Sim, a resposta do rush está correta, como eu disse. Sim, eles são sintaticamente iguais, como eu disse. Mas brace_groupse 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.
sucesso

2
Não sei se a distinção semântica é significativa aqui, pois é a sintaxe que importa para o analisador. A resposta real {é que não é um operador, mas uma palavra reservada, e as palavras precisam ser separadas de outras palavras para serem consideradas distintas.
Jw013 31/12/12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.