¿La tubería ejecuta comandos en paralelo?

¿La tubería ejecuta comandos en paralelo?

Estoy tratando de comprender las tuberías y la redirección con mayor profundidad. En cada guía dice que cmd1 cmd1 | cmd2se ejecutará y la salida estándar se compartirá con la entrada estándar de cmd2. Pero eso no me sienta muy bien en la cabeza, así que lo probé:

Entonces parece ambos ./test.shygrep están corriendo¡paralelo!

Aquí está el código fuente:

#!/bin/bash
a=0
while :
do
        ((a=a+1))
        echo "Line number $a"
        sleep 1
done

Probarlo con diferentes recomendaciones muestra resultados similares. ¿La tubería corre en paralelo?

¿Cómo funcionan la canalización y la redirección "bajo el capó"?

Respuesta1

Sí, todos los comandos se ejecutan al mismo tiempo. En su caso, grepcomienza al mismo tiempo que test.sh, pero como lee su entrada estándar, se bloquea hasta que test.shinserte algo, lo que no ocurrirá de inmediato. Los dos procesos se sincronizan entre sí, si el segundo es lento, el primero llenará su búfer de salida estándar y se le hará esperar hasta que el segundo haya leído algo. Si el primero es lento, el segundo se bloquea mientras lee la entrada si no hay ninguna disponible.

En la vida real, la salida estándar del primer proceso se escribe en fragmentos bastante grandes (alrededor de 4K)(*), por lo que el segundo proceso no tiene nada que leer hasta que el primer proceso haya escrito al menos 4K de datos. Su test.shuso echopodría ser un poco diferente y generar una salida con búfer de línea.

(*) La regla es que si la salida es a un "tty" (es decir, terminal), tiene un búfer de línea: un LF en la salida provoca que se produzca la salida real. De lo contrario, se almacena en búfer con fragmentos de 4K. El primer proceso también puede suprimir explícitamente todo el almacenamiento en búfer, pero esto es malo para el rendimiento.

Respuesta2

Realmente estás mirando lo que se denomina dirección flow controly/o (re)dirección, nuevamente; flow control, o stdin, stdout(entrada estándar/salida estándar).

Espero que mi afirmación anterior le ayude a comprender mejor qué esdestinadoque ocurra y qué se puede mejoraresperar.

tubo, o "tubería" stdout, simplementedirige stdouten la mayoría de los casos.

paralelo esen realidadotro nombre paratándem. Puedeintentarpara ejecutar 2 comandos/salidas diferentes/iguales al mismo tiempo. Pero esperando unsincronizadoejecutar sería imprudente, ya que es poco probable que ocurra.

A tu ejemplo; Aquí presentas lo que se llama uncondicional. Lo mismo que una señal de tráfico o un semáforo. Estoscondicional(s)directo fluirbasado encondición. En su ejemplo, elmientras"condición" --mientras este, hacereso. Condiciones generalesredirigir stdin, stdout.

En respuesta directa a tus 2 preguntas directas.

  1. ¿La tubería corre en paralelo?

No, no necesariamente. Al menos no en elnormalsentido de "paralelo" (tándem).

Pero pipe poderfuego (iniciar) 2trabajosal mismo tiempo. Incluso elmismotrabajodos veces.

  1. ¿Cómo funcionan la canalización y la redirección "bajo el capó"?

Espero haberte ilustrado mejor eso arriba. :)

o

cat ./ASCII | grep somename >./output

Lo anterior cat ./ASCIIesproducción( stdout). que se convierteaporte( stdin) por medio detubo( |) para grep somename. Cual es(re)dirigido( >) hasta su salida final ./output.

información relacionada