
Esto funciona perfectamente:
./foo | ./bar
Pero me gustaría algo así:
./bar <| ./foo
Entonces puedo canalizar al revés y cambiar los argumentos de foo más rápido en la línea de comando.
La tubería debe ser en tiempo real; mi foo
programa nunca regresa.
Es posible ?
Respuesta1
Una forma sencilla y adecuada puede ser definir una función foobar,
foobar () { ./foo "$@" | ./bar ; }
(ya sea en la línea de comando, según sea necesario, o en algunos scripts de inicio, como ".bashrc", por ejemplo). Entonces cada vez que lo hagas:
foobar "this" that "and this also"
lo hará
./foo this that "and this also" | ./bar
Respuesta2
./bar < <( ./foo )
Por ejemplo:cat < <(echo "hello there!")
Para entender cómo funciona, considere partes del guión por separado.
Esta sintaxis: cat < /path/to/file
leerá el archivo /path/to/file
y lo canalizará como entrada estándar a cat
.
Esta sintaxis: <(echo "hello there!")
significa ejecutar el comando y adjuntar la salida estándar a un descriptor de archivo como /dev/fd/65
. El resultado de toda la expresión es un texto como /dev/fd/65
y un comando se ejecuta en paralelo y alimenta ese descriptor de archivo.
Ahora, combinado, el script ejecutará el comando derecho, lo canalizará a un descriptor de archivo, convertirá ese descriptor de archivo a stdin para el comando izquierdo y ejecutará el comando izquierdo.
No hay gastos generales que yo sepa, es exactamente lo mismo que a | b
, solo azúcar sintáctico.
Respuesta3
Creo que podrías hacer algo así con una tubería con nombre:
mypipe=$(mktemp -d /tmp/XXXXXX)/pipe
mkfifo $mypipe
grep something < $mypipe & tail > $mypipe -f some_input_file
rm $mypipe
o coloque la parte que no cambia del comando en un script de shell:
./foo "$@" | ./bar
y proporcione los argumentos foo
en la línea de comando del script:
./myscript <args to foo>