Decir que tengo un comando foo
que toma un argumento de nombre de archivo: foo myfile.txt
. Molesto, foo
no lee de la entrada estándar. En lugar de un archivo real, me gustaría pasarle el resultado de otro comando (en realidad pv
, que capturará el archivo y generará un medidor de progreso como efecto secundario).
¿Hay una manera de hacer que esto suceda? Nada en mi bolsa de trucos parece hacerlo.
( foo
en este caso es un script PHP que creo que procesa el archivo secuencialmente).
Estoy usando Ubuntu y Bash
EDITAR Perdón por la descripción del problema un poco confusa, pero aquí está la respuesta que hace lo que quiero:
pv longfile.txt | foo /dev/stdin
Muy obvio ahora que lo veo.
Respuestas:
Si entiendo lo que quieres hacer correctamente, puedes hacerlo con la función de sustitución de comandos de bash:
Esto hace algo similar a lo que
mkfifo
sugieren las respuestas basadas en, excepto que bash maneja los detalles por usted (y termina pasando algo como / dev / fd / 63 al comando, en lugar de una tubería con nombre normal). También puede hacerlo incluso más directamente de esta manera:fuente
pv inputfile.txt | foo /dev/stdin
es exactamente lo que estaba buscando, pero no pensé.<(.)
trabajó para mi. ¿Esta sintaxis está documentada en el manual de Bash? Entiendo(.)
que la sustitución de comandos está documentada, pero no vi su combinación con<
explicada.mkfifo
.fuente
Esta pregunta de Unix SE tiene una respuesta que muestra cómo crear una tubería con nombre temporal:
Shell Script mktemp, ¿cuál es el mejor método para crear una tubería con nombre temporal?
Según las respuestas allí, podría hacer algo como lo siguiente:
Luego puedes mirar la tubería con:
Luego elimínelo cuando haya terminado con él.
fuente
Intenta usar mkfifo.
En otro shell, ejecute foo file_read_by_foo
fuente
xargs
parece funcionar bien para esto:fuente
pv
varias veces, cada una con una o más líneas extraídaslongfile.txt
. Para nada lo que busco aquí.