Comment puis-je diffuser des données vers un programme qui s'attend à lire des données à partir d'un fichier qui est donné comme argument?

17

J'ai un énorme fichier gzippé et je veux qu'un programme (4s-import dans ce cas) le lise. Il faut beaucoup de temps pour d'abord décompresser le fichier, puis appeler le programme avec le chemin d'accès au fichier comme argument. Serait-il possible de faire quelque chose comme:

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

où SOME-MAGIC est comme un chemin vers un fichier abstrait qui contient stdin?

L'alternative beaucoup plus lente et consommatrice d'espace disque que je dois faire autrement est:

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

Réponses:

32

Vous pouvez utiliser l'opérateur <()de substitution de processus de bash(ou zsh):

4s-import <(zcat huge.gz)

Cet opérateur créera un fifo temporaire /dev/fd/NNet le remplacera <(.)par la chaîne /dev/fd/NN. 4s-importpeut maintenant s'ouvrir /dev/fd/NNet lire à partir de ce fifo, tandis que bashs'exécutera zcat huge.gz, qui envoie sa sortie à /dev/fd/NN.

tkrennwa
la source
17
  1. De nombreux programmes ont une -entrée standard. Si le vôtre le fait, utilisez-le car il est "intégré".

  2. Vous pouvez également essayer d'utiliser /dev/stdinou en /dev/fd/0tant que fichier.

  3. Une troisième option consiste à utiliser mkfifopour créer un fichier spécial fifo. Dans un shell, vous canalisez vos données (par exemple gunzip > your_fifo_file), tandis que dans l'autre, vous appelez votre programme avec le fifo comme fichier.

Bgs
la source