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

17

Eu tenho um enorme arquivo gzipado e eu quero um programa (4s-import neste caso) para lê-lo. Demora muito tempo para primeiro descompactar o arquivo e, em seguida, chamar o programa com o caminho para o arquivo como um 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 mais lenta e mais consumidora de espaço em disco que eu tenho que fazer de outra forma é:

zcat huge.gz > huger
4s-import huger
    
por Jonatan Kallus 14.11.2013 / 11:04

2 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 /dev/fd/NN e substituirá <(.) pela string /dev/fd/NN . 4s-import agora pode abrir /dev/fd/NN e ler a partir desse fifo, enquanto bash executará zcat huge.gz , que envia sua saída para /dev/fd/NN .

    
por 14.11.2013 / 13:28
17
  1. Muitos programas têm - como entrada padrão. Se o seu fizer isso, use-o como se fosse "construído".

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

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

por 14.11.2013 / 11:12