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.


¿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

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


1

Intenta usar mkfifo.

mkfifo file_read_by_foo; pv ... > file_read_by_foo 

En otro shell, ejecute foo file_read_by_foo


0

xargs parece funcionar bien para esto:

echo longfile.txt | xargs pv

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.