如何将数据流式传输到希望从作为参数给出的文件中读取数据的程序?

Jon*_*lus 17 shell bash io-redirection arguments

我有一个巨大的 gzipped 文件,我想要一个程序(在这种情况下为 4s-import)来读取它。首先解压缩文件,然后以文件路径作为参数调用程序需要花费大量时间。是否有可能做这样的事情:

zcat huge.gz | 4s-import <SOME MAGIC>
Run Code Online (Sandbox Code Playgroud)

SOME-MAGIC 就像包含标准输入的抽象文件的路径?

否则我必须做的更慢、更消耗磁盘空间的替代方案是:

zcat huge.gz > huger
4s-import huger
Run Code Online (Sandbox Code Playgroud)

tkr*_*nwa 33

您可以使用过程替换操作<()bash(或zsh):

4s-import <(zcat huge.gz)
Run Code Online (Sandbox Code Playgroud)

此运算符将创建一个临时 fifo/dev/fd/NN并替换<(.)为字符串/dev/fd/NN4s-import现在可以打开/dev/fd/NN并读取该 fifo,而bash将运行zcat huge.gz,它将其输出发送到/dev/fd/NN.


Bgs*_*Bgs 17

  1. 许多程序都有一个-作为标准输入。如果你的,使用它,因为它是“内置的”。

  2. 您也可以尝试使用/dev/stdin/dev/fd/0作为文件。

  3. 第三个选项是用来mkfifo创建一个fifo 特殊文件。在一个 shell 中,您输入数据(例如gunzip > your_fifo_file),而在另一个 shell 中,您使用 fifo 作为文件调用您的程序。