¿Cómo puedo transmitir datos a un programa que espera leer datos de un archivo que se proporciona como argumento?

17

Tengo un gran archivo comprimido y quiero un programa (4s-import en este caso) para leerlo. Lleva mucho tiempo descomprimir primero el archivo y luego llamar al programa con la ruta del archivo como argumento. ¿Sería posible hacer algo como:

zcat huge.gz | 4s-import <SOME MAGIC>

donde ALGUNA MAGIA es como una ruta a un archivo abstracto que contiene stdin?

La alternativa mucho más lenta y que consume más espacio en disco que tengo que hacer de otra manera es:

zcat huge.gz > huger
4s-import huger
Jonatan Kallus
fuente

Respuestas:

32

Puede usar el operador <()de sustitución de proceso de bash(o zsh):

4s-import <(zcat huge.gz)

Este operador creará un fifo temporal /dev/fd/NNy lo reemplazará <(.)con la cadena /dev/fd/NN. 4s-importahora puede abrir /dev/fd/NNy leer desde ese fifo, mientras bashse ejecutará zcat huge.gz, lo que envía su salida a /dev/fd/NN.

tkrennwa
fuente
17
  1. Muchos programas tienen una -entrada estándar. Si el tuyo lo hace, úsalo como "incorporado".

  2. También puede intentar usar /dev/stdino /dev/fd/0como un archivo.

  3. Una tercera opción es utilizar mkfifopara crear un archivo especial de fifo. En un shell, ingresa sus datos (p. Ej. gunzip > your_fifo_file), Mientras que en el otro llama a su programa con el fifo como archivo.

Bgs
fuente