enquanto lê, grep, pipes e pendura

enquanto lê, grep, pipes e pendura
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 whileloop, grepe, greprespectivamente. 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 SIGPIPEs 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, greprespectivamente. Mas o segundo processo, aquele que executa o programa shell, está gerando continuamente doisavançarprocessos filhos, um executando echoe outro executando outra grepinstância. É esse último processo que é enviado SIGPIPEenã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 whileloop, nunca éem sifinalizado SIGPIPEe continua em execução, gerando um pipeline filho; de novo e de novo. Ele vê o pipeline filho gerado terminar com um SIGPIPEclaro, mas para o shell que executa o whileloop que énãoum motivo para encerrar o loop.

informação relacionada