Как я могу передать данные в программу, которая ожидает чтения данных из файла, который задан в качестве аргумента?

17

У меня есть огромный gzip-файл, и я хочу, чтобы программа (в данном случае 4s-import) его прочитала. Сначала требуется разархивировать файл, а затем вызвать программу с путем к файлу в качестве аргумента. Было бы возможно сделать что-то вроде:

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

где SOME-MAGIC похож на путь к абстрактному файлу, который содержит stdin?

Более медленная и занимающая больше места на диске альтернатива, которую я должен сделать в противном случае:

zcat huge.gz > huger
4s-import huger
Джонатан Каллус
источник

Ответы:

32

Вы можете использовать оператор замены <()процесса bash(или zsh):

4s-import <(zcat huge.gz)

Этот оператор создаст временную fifo /dev/fd/NNи заменит <(.)строку /dev/fd/NN. 4s-importтеперь можно открывать /dev/fd/NNи читать с этого fifo, пока bashбудет выполняться zcat huge.gz, который отправит свой вывод /dev/fd/NN.

tkrennwa
источник
17
  1. Многие программы имеют -стандартный ввод. Если у вас есть, используйте его как встроенный.

  2. Вы также можете попробовать использовать /dev/stdinили /dev/fd/0как файл.

  3. Третий вариант - использовать mkfifoдля создания специального файла fifo. В одной оболочке вы передаете свои данные (например, gunzip > your_fifo_file), а в другой вы вызываете свою программу с fifo в качестве файла.

Bgs
источник