mientras lee, grep, tuberías y cuelga

mientras lee, grep, tuberías y cuelga
yes "test" | grep -m3 "test"

huellas dactilares

test
test
test

y luego termina. También lo hace

yes "test" | while read line; do echo $line; done | grep -m3 "test"

y

yes "test" | while read line; do echo $line; done | grep -E "*" | grep -m3 "test"

Pero

yes "test" | while read line; do echo $line | grep -E "*"; done | grep -m3 "test"

huellas dactilares

test
test
test

y luego se cuelga. ¿Que está sucediendo aquí?

Respuesta1

En

sí "prueba" | mientras lee la línea; hacer eco $linea; hecho | grep -E "*" | grep -m3 "prueba"
hay cuatro procesos, ejecutándose yes, el programa shell ejecutando ese whilebucle, grepy greprespectivamente. El último proceso en la tubería termina, cerrando el extremo de lectura de su tubería de entrada, después de tres coincidencias. Luego, la tubería termina en una cadena de SIGPIPEs, de la forma habitual para las tuberías terminadas prematuramente, ya que cada etapa de la tubería, a su vez, termina escribiendo en una tubería rota.

En

sí "prueba" | mientras lee la línea; hacer eco $linea | grep -E "*"; hecho | grep -m3 "prueba"
hay tres procesos ejecutándose yes, el programa shell y greprespectivamente. Pero el segundo proceso, el que ejecuta el programa shell, genera continuamente dosmásprocesos secundarios, uno haciendo echoy otro ejecutando otra grepinstancia. Es este último proceso el que se envía el SIGPIPEynoel proceso que ejecuta el programa shell. Después de todo, es este último proceso el que en realidad está escribiendo en la tubería rota.

La consecuencia de esto es que la segunda etapa del proceso, el shell que ejecuta ese whilebucle, nunca se ejecuta.sí mismoterminó SIGPIPEy continúa ejecutándose, generando una canalización secundaria; una y otra vez. Ve que la canalización secundaria que generó termina con un, SIGPIPEpor supuesto, pero para el shell que ejecuta el whilebucle que esnouna razón para terminar el ciclo.

información relacionada