
Estou tentando entender a tubulação e o redirecionamento com mais profundidade. Em todos os guias diz que no cmd1 | cmd2
cmd1 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 grep
inicia ao mesmo tempo que o test.sh
, mas como lê seu stdin, fica bloqueado até test.sh
colocar 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.sh
uso echo
pode 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 control
e/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 stdout
na 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
- 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.
- 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
.