
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 while
bucle, grep
y grep
respectivamente. 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 SIGPIPE
s, 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 grep
respectivamente. Pero el segundo proceso, el que ejecuta el programa shell, genera continuamente dosmásprocesos secundarios, uno haciendo echo
y otro ejecutando otra grep
instancia. Es este último proceso el que se envía el SIGPIPE
ynoel 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 while
bucle, nunca se ejecuta.sí mismoterminó SIGPIPE
y continúa ejecutándose, generando una canalización secundaria; una y otra vez. Ve que la canalización secundaria que generó termina con un, SIGPIPE
por supuesto, pero para el shell que ejecuta el while
bucle que esnouna razón para terminar el ciclo.