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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.