Separador entre lista de comandos e}

3

O Manual do Bash diz

{ 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.

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.

Se ignorar o ponto e vírgula,:

$ { date }
>
  1. por que espera entrada de stdin?

  2. Um metacaractere é um caractere que separa as palavras. O ponto-e-vírgula e o espaço em branco são ambos "metacaracteres de casca". Por que não é possível espaçar as palavras separadas date e } ? Por que precisamos de um ponto-e-vírgula em vez de um espaço em branco para separar as palavras?

por Tim 04.03.2016 / 22:09

2 respostas

5
  1. Está aguardando o fechamento de } . Você inseriu uma lista com um comando, date } e uma nova linha, então você ainda está dentro do grupo de comando e pode adicionar outro comando à lista ou finalizá-lo.

    Portanto, não está aguardando a entrada padrão (exatamente), está aguardando que você conclua o comando iniciado na primeira linha. Se você inserir } aqui, você (provavelmente) obterá um erro do comando date dizendo que não entende " } ".

  2. { e } são argumentos válidos para comandos comuns, como visto no ponto 1. Por exemplo, find usa {} como argumento.

    Especificamente, apenas exatamente " { " e " } " são palavras reservadas . As palavras reservadas na concha só importam quando são dadas exatamente como uma palavra inteira, e apenas onde são especificamente esperadas. O lugar mais importante que eles esperam é no início de um comando.

    O ponto e vírgula ou nova linha significa que } aparece no início do próximo comando na lista, onde pode ser reconhecido como uma palavra reservada e dado seu tratamento especial. Este é especificado por POSIX para a gramática de shell :

    This rule also implies that reserved words are not recognized except in certain positions in the input, such as after a <newline> or <semicolon>; the grammar presumes that if the reserved word is intended, it is properly delimited by the user

    Seria irritante se "then", outra palavra reservada, não pudesse ser usada como uma palavra normal, de modo que basicamente faz sentido. ( e ) , por outro lado, são operadores, podem aparecer em qualquer lugar e precisam ser ignorados se forem usados para seus valores literais. Este é essencialmente um artefato histórico, e dado um repasse talvez uma escolha mais consistente seria feita em uma direção ou outra, ou talvez um analisador mais complexo seria mandado.

Para o Bash em particular, chaves para agrupamento de comandos também precisam ser distinguidas de chaves para brace expansion , e o analisador faz uma suposição de que é improvável que você esteja expandindo o comando que começa com um espaço.

Existe a opção de manter ou não a compatibilidade histórica de caso de canto, e alguns outros shells, como zsh, possuem analisadores mais inteligentes e são capazes de lidar com { date } com o significado pretendido.

    
por 04.03.2016 / 23:13
1
  1. Está esperando por você para concluir o comando. O mesmo acontece se você escrever um incompleto se ou enquanto ou outros:

    $ if date
    >
    
  2. O comando está claramente definido no manual: Um { list; } é um comando composto:

    Compound Commands

    { list; } list must be terminated with a newline or semicolon.

    É claramente declarado lá: "terminado com uma nova linha ou ponto e vírgula"

por 06.03.2016 / 03:20

Tags