A tubulação executa comandos em paralelo?

A tubulação executa comandos em paralelo?

Estou tentando entender a tubulação e o redirecionamento com mais profundidade. Em todos os guias diz que no cmd1 | cmd2cmd1 será executado e o stdout será compartilhado com o stdin do cmd2. Mas isso não parece muito bom na minha cabeça, então testei:

Então parece que ambos ./test.shegrep está rodandoparalelo!

Aqui está o código fonte:

#!/bin/bash
a=0
while :
do
        ((a=a+1))
        echo "Line number $a"
        sleep 1
done

Tentar com recomendações diferentes mostra resultados semelhantes. O tubo corre em paralelo?

Como o pipe e o redirecionamento funcionam "nos bastidores"?

Responder1

Sim, todos os comandos são executados ao mesmo tempo. No seu caso ele grepinicia ao mesmo tempo que o test.sh, mas como lê seu stdin, fica bloqueado até test.shcolocar algo nele, o que não ocorrerá de uma vez. Os dois processos se acompanham, se o segundo for lento, o primeiro preencherá seu buffer de saída padrão e será obrigado a esperar até que o segundo tenha lido algum. Se o primeiro for lento, o segundo será bloqueado enquanto lê a entrada, caso não haja nenhuma disponível.

Na vida real, o stdout do primeiro processo é escrito em pedaços bastante grandes (cerca de 4K)(*), então o segundo processo não tem nada para ler até que o primeiro processo tenha escrito pelo menos 4K de dados. Seu test.shuso echopode ser um pouco diferente e gerar saída com buffer de linha.

(*) A regra é que se a saída for para um "tty" (ou seja, terminal), ela será armazenada em buffer de linha: um LF na saída faz com que a saída real ocorra. Caso contrário, ele será armazenado em buffer por pedaços de 4K. O primeiro processo também pode suprimir explicitamente todo o buffer, mas isso é ruim para o desempenho.

Responder2

Você está realmente olhando para o que é denominado flow controle/ou (re)direção - novamente; flow control, ou stdin, stdout(entrada padrão/saída padrão).

Espero que minha declaração acima ajude você a entender melhor o que épretendidoocorrer, e o que você pode melhoraresperar.

cano, ou "tubulação" stdout, meramentedirige stdoutna maioria dos casos.

Paralelo érealmenteoutro nome paratandem. Você podetentarpara executar 2 comandos/saídas diferentes/iguais ao mesmo tempo. Mas esperando umsincronizadocorrer seria imprudente, pois é improvável que ocorra.

Para o seu exemplo; Aqui você apresenta o que é chamado decondicional. Muito parecido com um sinal de trânsito ou um semáforo. Essescondicional(s)direto fluxobaseado em umdoença. No seu exemplo, oenquanto"doença" --enquanto esse, fazerque. Condições geralmenteredirecionar stdin, stdout.

Em resposta direta às suas 2 perguntas diretas

  1. O tubo corre em paralelo

Não, não necessariamente. Pelo menos não nonormalsentido de "paralelo" (tandem).

Mas pipe podefogo (iniciar) 2empregosao mesmo tempo. Mesmo omesmotrabalhoduas vezes.

  1. Como o pipe e o redirecionamento funcionam "nos bastidores"?

Espero ter ilustrado melhor isso para você acima. :)

ou

cat ./ASCII | grep somename >./output

O acima cat ./ASCIIésaída( stdout). O que se tornaentrada( stdin) por meio decano( |) para grep somename. Qual é(re)dirigido( >) até sua saída final ./output.

informação relacionada