Realmente nunca he pensado en cómo el shell ejecuta realmente los comandos canalizados. Siempre me han dicho que la "salida estándar de un programa se canaliza into the stdin of another”, como una forma de pensar en las tuberías. Entonces, naturalmente, pensé que en el caso de decir, 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 su 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 aparece 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
se 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 corriendo?
[email protected]: ~$ 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 aceptada:
Los comandos canalizados se ejecutan simultáneamente. 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
comienza primero y, en cualquier caso, continúan ejecutándose simultáneamente.
Esto se usa muy comúnmente para permitir que el segundo programa procese los datos tal como 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 grep
ha terminado de recorrer el archivo grande.
grep pattern very-large-file | head -n 1
muestra la primera línea coincidente y puede dejar de procesar mucho antes de grep
ha 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 simultáneamente y siempre lo han hecho.