Pregunta:
Realmente nunca pensé en cómo el shell ejecuta realmente los comandos canalizados. Siempre me han dicho que "el stdout de un programa se canaliza al stdin de otro", como una forma de pensar en las canalizaciones. Entonces, naturalmente, pensé que en el caso de, digamos, A | B
, A
se ejecutaría primero, luego B
obtiene la salida estándar de A
y usa la salida estándar de A
como entrada.
Pero he notado que cuando las personas buscan un proceso en particular en ps
, incluirían grep -v "grep"
al final del comando para asegurarse de que grep
no aparezca en el resultado final.
Esto significa que en el comando ps aux | grep "bash" | grep -v "grep"
se da a entender que ps
sabía que grep
estaba ejecutando y, por lo tanto, está en la salida de ps
. Pero si ps
termina de ejecutarse antes de que su salida se canalice a grep
, ¿cómo supo que grep
estaba ejecutando?
flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY TIME CMD
3773 pts/0 00:00:00 bash
3784 pts/0 00:00:00 ps
3785 pts/0 00:00:00 grep
Respuesta:
Los comandos canalizados se ejecutan al mismo tiempo. Cuando ejecuta ps | grep …
, es la suerte del sorteo (o una cuestión de detalles del funcionamiento del shell combinado con el ajuste fino del programador en las entrañas del kernel) si ps
o grep
comienzan primero, y en cualquier caso continúan para ejecutar al mismo tiempo.
Esto se usa muy comúnmente para permitir que el segundo programa procese los datos a medida que salen del primer programa, antes de que el primer programa haya completado su operación. Por ejemplo
grep pattern very-large-file | tr a-z A-Z
comienza a mostrar las líneas coincidentes en mayúsculas incluso antes de que grep
haya terminado de atravesar el archivo grande.
grep pattern very-large-file | head -n 1
muestra la primera línea coincidente y puede detener el procesamiento mucho antes de que grep
haya terminado de leer su archivo de entrada.
Si lee en alguna parte que los programas canalizados se ejecutan en secuencia, huya de este documento. Los programas canalizados se ejecutan al mismo tiempo y siempre lo han hecho.