Como posso transmitir dados para um programa que espera ler dados de um arquivo que é fornecido como argumento?

17

Eu tenho um arquivo gzip enorme e quero um programa (4s-import neste caso) para lê-lo. Leva muito tempo para descompactar o arquivo e depois chamar o programa com o caminho para o arquivo como argumento. Seria possível fazer algo como:

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

onde SOME-MAGIC é como um caminho para um arquivo abstrato que contém stdin?

A alternativa muito mais lenta e com mais espaço em disco que eu tenho que fazer de outra maneira é:

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

Respostas:

32

Você pode usar o operador <()de substituição de processo de bash(ou zsh):

4s-import <(zcat huge.gz)

Este operador criará um fifo temporário /dev/fd/NNe substituirá <(.)pela string /dev/fd/NN. 4s-importagora pode abrir /dev/fd/NNe ler a partir desse fifo, enquanto bashserá executado zcat huge.gz, o qual envia sua saída para /dev/fd/NN.

tkrennwa
fonte
17
  1. Muitos programas têm uma -entrada como padrão. Se o seu fizer, use-o como está "embutido".

  2. Você também pode tentar usar /dev/stdinou /dev/fd/0como um arquivo.

  3. Uma terceira opção é usar mkfifopara criar um arquivo especial do fifo. Em um shell, você insere seus dados (por exemplo gunzip > your_fifo_file), enquanto no outro chama o seu programa com o fifo como arquivo.

Bgs
fonte