
yes "test" | grep -m3 "test"
estampas
test
test
test
e então termina. O mesmo acontece
yes "test" | while read line; do echo $line; done | grep -m3 "test"
e
yes "test" | while read line; do echo $line; done | grep -E "*" | grep -m3 "test"
Mas
yes "test" | while read line; do echo $line | grep -E "*"; done | grep -m3 "test"
estampas
test
test
test
e depois trava. O que esta acontecendo aqui?
Responder1
Em
sim "teste" | enquanto lê a linha; faça echo $ linha; feito | grep -E "*" | grep -m3 "teste"existem quatro processos, em execução
yes
, o programa shell executando esse while
loop, grep
e, grep
respectivamente. O último processo no pipeline termina, fechando a extremidade de leitura do seu pipe de entrada, após três partidas. O pipeline então termina em uma cadeia de SIGPIPE
s da maneira usual para pipelines encerrados prematuramente, já que cada estágio do pipline, por sua vez, acaba escrevendo em um pipe quebrado.
Em
sim "teste" | enquanto lê a linha; faça echo $line | grep -E "*"; feito | grep -m3 "teste"existem três processos em execução
yes
, o programa shell e, grep
respectivamente. Mas o segundo processo, aquele que executa o programa shell, está gerando continuamente doisavançarprocessos filhos, um executando echo
e outro executando outra grep
instância. É esse último processo que é enviado SIGPIPE
enãoo processo executando o programa shell. Afinal, é esse último processo que está realmente escrevendo no cano quebrado.
A consequência disso é que o segundo estágio do pipeline, o shell que executa esse while
loop, nunca éem sifinalizado SIGPIPE
e continua em execução, gerando um pipeline filho; de novo e de novo. Ele vê o pipeline filho gerado terminar com um SIGPIPE
claro, mas para o shell que executa o while
loop que énãoum motivo para encerrar o loop.