¿Es posible crear un bucle de comandos con tubería o algo más?

¿Es posible crear un bucle de comandos con tubería o algo más?

Hasta ahora, conozco el mecanismo de tubería como una forma de conectar una serie de comandos conectando la salida estándar de un comando a la entrada estándar del siguiente comando hasta llegar al último comando, que conecta su salida estándar con la pantalla o un archivo.

¿Sería posible, sin embargo, hacer un bucle con los comandos, de modo que la salida estándar del último comando se conecte a la entrada estándar del primer comando y tal vez al usar tee de alguna manera se puedan mostrar los valores cambiantes de una determinada salida?

Respuesta1

No estoy seguro de todos los shells que existen, pero en Bash es posible, aunque no con canalizaciones sin nombre. Entonces no con el |símbolo. Pero si crea una tubería con nombre:

mkfifo fifo

Entonces puedes usarlo:

<fifo cat | cat >fifo &

Ahora la canalización funciona en segundo plano, pero no hace nada. Pero si alimenta la tubería desde fuera de la tubería:

echo x >fifo

El oleoducto se desbloqueará y continuará para siempre. O hasta drenar la tubería:

cat fifo

La salida aparecerá una vez:

x

Para hacerlo un poco más sofisticado, el pipeline puede ser este:

<fifo cat | xargs -I@ echo @x >fifo &

Por lo tanto, agregará un xa la salida en cada iteración. Por supuesto que lo hará, pero solo una vez que comiencen las iteraciones, es decir, tan pronto como se desbloquee la tubería, es decir, tan pronto como haya algo para leer. Como antes, esto se puede iniciar manualmente:

echo x >fifo

Y ahora eche un vistazo a lo que topmuestra. Debería haber bastante actividad tanto en como caten xargs.

Y lo mismo que antes, si drena la tubería, debería ver muchos xs en la terminal y la tubería se bloqueará.

Sería una pregunta válida: ¿por qué se drena el oleoducto? ¿Por qué el catcomando se confirma en la terminal sin dejar nada en el circuito? No lo sé.

Respuesta2

Bueno, ciertamente podrías simplemente hacer un bucle y usar variables:

while true; do
    a=$(echo "$a" | grep "Hey" | cut -d" " -f2 | tee -a log)
done

Eso guardaría la última salida que se usaría nuevamente al principio.

Respuesta3

Como respuesta existente, la canalización en bucle no es posible en el shell de Unix sin utilizar una canalización con nombre (creada usandomkfifo(1)). Pero puedes hacerlo en C; por ejemplo aquí está miimplementación muy simple, que ni siquiera esperó a que salieran los procesos.

Espero que encuentre esta información útil.

información relacionada