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.

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
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:fuente
pv inputfile.txt | foo /dev/stdines 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
xargsparece funcionar bien para esto:fuente
pvvarias veces, cada una con una o más líneas extraídaslongfile.txt. Para nada lo que busco aquí.