Jak mogę przesyłać strumieniowo dane do programu, który spodziewa się odczytać dane z pliku podanego jako argument?

17

Mam ogromny spakowany gzip plik i chcę, aby program (w tym przypadku import 4s) go przeczytał. Rozpakowanie pliku zajmuje dużo czasu, a następnie wywołanie programu ze ścieżką do pliku jako argumentem. Czy można by zrobić coś takiego:

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

gdzie SOME-MAGIC jest ścieżką do abstrakcyjnego pliku zawierającego standardowe wejście?

O wiele wolniejszą i zajmującą więcej miejsca na dysku alternatywą, którą muszę zrobić inaczej, jest:

zcat huge.gz > huger
4s-import huger
Jonatan Kallus
źródło

Odpowiedzi:

32

Można użyć operatora podstawienie proces <()z bash(a zsh)

4s-import <(zcat huge.gz)

Ten operator utworzy tymczasowy plik fifo /dev/fd/NNi zastąpi <(.)go łańcuchem /dev/fd/NN. 4s-importteraz można otworzyć /dev/fd/NNi odczytać z tego fifo, podczas gdy bashuruchomi się zcat huge.gz, co wyśle ​​jego wyjście do /dev/fd/NN.

tkrennwa
źródło
17
  1. Wiele programów ma -standardowe wejście. Jeśli tak, użyj tego jako „wbudowanego”.

  2. Możesz także spróbować użyć /dev/stdinlub /dev/fd/0jako pliku.

  3. Trzecią opcją jest mkfifoutworzenie specjalnego pliku fifo. W jednej powłoce wstawiasz dane (np. gunzip > your_fifo_file), Podczas gdy w drugiej wywołujesz program z fifo jako plikiem.

Bgs
źródło