Pase una tubería a un comando que espera un nombre de archivo

19

Decir que tengo un comando fooque toma un argumento de nombre de archivo: foo myfile.txt. Molesto, foono 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.

( fooen 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.

Steve Bennett
fuente
¿Estás buscando una línea?
Dave Forgac
¿Estás seguro de que foo no acepta un argumento de "-" para que se lea desde stdin?
rackandboneman
Lamentablemente sí, en este caso, es un script php.
Steve Bennett
Si en realidad .
Steve Bennett

Respuestas:

19

Si entiendo lo que quieres hacer correctamente, puedes hacerlo con la función de sustitución de comandos de bash:

foo <(somecommand | pv)

Esto hace algo similar a lo que mkfifosugieren 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:

somecommand | pv | foo /dev/stdin
Gordon Davisson
fuente
1
oh, linda! Esto pv inputfile.txt | foo /dev/stdines exactamente lo que estaba buscando, pero no pensé.
Steve Bennett
Woot! / dev / stdin
sabio
<(.)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.
flow2k
@ flow2k Se llama "sustitución de proceso"; consulte la sección 3.5.6 del manual de bash .
Gordon Davisson
Entendido. Tienes razón: menciona que usa tuberías con nombre / mkfifo.
flow2k
2
ARRAY=(`pv whatever`); for FILE in $ARRAY; do foo $FILE; done
Hippy
fuente
1

Intenta usar mkfifo.

mkfifo file_read_by_foo; pv ... > file_read_by_foo 

En otro shell, ejecute foo file_read_by_foo

cada vez más sabio
fuente
0

xargs parece funcionar bien para esto:

echo longfile.txt | xargs pv
MadHatter apoya a Monica
fuente
Eso hace algo diferente: ejecutarse pvvarias veces, cada una con una o más líneas extraídas longfile.txt. Para nada lo que busco aquí.
Steve Bennett