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

17

Você provavelmente sabe disso fork fork :

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

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

    
por Benoit 05.07.2012 / 09:01

2 respostas

12

{}

          { list; }

Placing a list of commands between curly braces causes the list to be executed in the current shell context. No subshell is created. The semicolon (or newline) following list is required.

In addition to the creation of a subshell, there is a subtle difference between these two constructs due to historical reasons. The braces are reserved words, so they must be separated from the list by blanks or other shell metacharacters. The parentheses are operators, and are recognized as separate tokens by the shell even if they are not separated from the list by whitespace.

// source

    
por 05.07.2012 / 09:43
3

Eu acho que o @rush pode estar dando uma resposta correta, mas enganosa, aqui. O fork-bomb define uma função chamada " : ". O código nas chaves não é executado até que a função seja chamada pelo final " : ". Portanto, as chaves como agrupamento de comandos e as chaves como corpo da função são sintaticamente as mesmas, mas possuem semânticas diferentes.
Do mesmo documento como @rush cites:

Note that for historical reasons, in the most common usage the curly braces that surround the body of the function must be separated from the body by blanks or newlines. This is because the braces are reserved words and are only recognized as such when they are separated from the command list by whitespace or another shell metacharacter. Also, when using the braces, the list must be terminated by a semicolon, a ‘&’, or a newline.

    
por 05.07.2012 / 20:44