
Estoy tratando de comprender las tuberías y la redirección con mayor profundidad. En cada guía dice que cmd1 cmd1 | cmd2
se 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, grep
comienza al mismo tiempo que test.sh
, pero como lee su entrada estándar, se bloquea hasta que test.sh
inserte 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.sh
uso echo
podrí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 control
y/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 stdout
en 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.
- ¿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.
- ¿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 ./ASCII
esproducción( stdout
). que se convierteaporte( stdin
) por medio detubo( |
) para grep somename
. Cual es(re)dirigido( >
) hasta su salida final ./output
.