O que exatamente está acontecendo quando um pipe é seguido por um agrupamento de comandos?

1

Eu vi uma expressão como command1 | {command2;command3;command4} e eu estava pensando o que isso realmente significa, eu sei o símbolo do pipe, eu sei que {...} força a executar os comandos dentro das chaves no shell principal, mas eu estou confuso o que eles significam em combinação.

    
por sharkant 24.05.2017 / 21:05

4 respostas

4

Não importa quão complexas são as partes de um pipeline, você pode frequentemente visualizá-las como scripts separados, se quiser (especialmente em shells como bash , que executará cada parte de um pipeline em uma subshell de qualquer maneira ).

O script

command2
command3
command4

... que aproximadamente é o que o { command2; command3; command4; } traduz (não levando em consideração que { ...; } significa que os comandos não são executados em um subshell), é dado entrada da execução de

command1

Dependendo do que esses três comandos no primeiro script estão fazendo, um ou vários deles provavelmente consumirão a entrada de command1 e, se um ou vários deles produzirem alguma saída, isso irá para a próxima parte. do pipeline, ou para o terminal ou para onde a saída do pipeline for redirecionada.

    
por 24.05.2017 / 21:53
2

A saída padrão de command1 será usada para o primeiro comando no bloco de comando que começa a ler a partir da entrada padrão. Na maioria dos casos, isso será command2 .

    
por 24.05.2017 / 21:08
2

{...} forces to run the commands inside the curly brackets in the main shell

Esta não é uma boa descrição do que as chaves fazem em geral. O grupo de chaves comanda de uma maneira que não cria uma subcamada. Em outras palavras, chaves não criam em si mesmas um subnível: o código entre chaves é executado no mesmo shell como se não houvesse chaves, ao contrário do código entre parênteses que é sempre executado em um subshell (portanto seus redirecionamentos, variáveis, e assim por diante não afetam o shell pai ou qualquer outro shell).

O ponto das chaves é permitir escrever comandos complexos onde a sintaxe espera um único comando. Por exemplo, em command1 | { command2; command3; command4; } (observe que os espaços e o ponto e vírgula final são necessários), o lado direito do canal é { command2; command3; command4; } . O comando { command2; command3; command4; } executa command2 , depois command3 e, em seguida, command4 . Todos esses comandos recebem entrada do pipe. (Como os comandos são executados sucessivamente, command3 obtém qualquer entrada depois que command2 é executado, e assim por diante.)

    
por 25.05.2017 / 02:29
2

pense nas chaves como uma função sem nome. por exemplo,

command234 () { command2; command3; command4; }

command1 | command234 

dá o mesmo resultado. Quando as coisas ficam muito complicadas, prefiro nomear o agrupamento. se apenas para testes.

    
por 25.05.2017 / 21:30