Wie kann ich Daten zu einem Programm streamen, das erwartet, Daten aus einer Datei zu lesen, die als Argument angegeben wird?

17

Ich habe eine riesige gzip-Datei und möchte, dass sie von einem Programm (in diesem Fall 4s-Import) gelesen wird. Es braucht viel Zeit, um die Datei zuerst zu entpacken und dann das Programm mit dem Pfad zur Datei als Argument aufzurufen. Wäre es möglich, etwas zu tun wie:

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

Wo ist SOME-MAGIC wie ein Pfad zu einer abstrakten Datei, die stdin enthält?

Die viel langsamere und speicherplatzintensivere Alternative, die ich sonst tun muss, ist:

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

Antworten:

32

Sie können den Prozessersetzungsoperator <()von bash(oder zsh) verwenden:

4s-import <(zcat huge.gz)

Dieser Operator erstellt ein temporäres FIFO /dev/fd/NNund ersetzt es <(.)durch die Zeichenfolge /dev/fd/NN. 4s-importJetzt kann /dev/fd/NNman aus diesem FIFO öffnen und lesen, während ausgeführt bashwird zcat huge.gz, was seine Ausgabe an sendet /dev/fd/NN.

tkrennwa
quelle
17
  1. Viele Programme haben eine -Standardeingabe. Wenn dies bei Ihnen der Fall ist, verwenden Sie dies als "eingebaut".

  2. Sie können auch versuchen, /dev/stdinoder /dev/fd/0als Datei zu verwenden.

  3. Eine dritte Möglichkeit besteht darin mkfifo, eine FIFO-Spezialdatei zu erstellen. In der einen Shell gunzip > your_fifo_fileleiten Sie Ihre Daten ein (zB ), in der anderen rufen Sie Ihr Programm mit dem FIFO als Datei auf.

Bgs
quelle