如何在bash中通过管道传递两个变量?

时间:2017-06-02 14:56:02

标签: bash variables parameters pipe

一个程序我想运行一个接受两个输入的程序,但输入必须先解压缩。问题是文件太大,解压缩它们不是一个好的解决方案,所以我需要解压缩输入。例如:

gunzip myfile.gz | runprog > hurray.txt

这是一件非常好的事情,但我想要运行的程序需要两个输入,两个输入都必须解压缩。所以

gunzip file1.gz

gunzip file2.gz

runprog -1 file1_unzipped -2 file2_unzipped 

我需要的是一些解压缩文件并通过管道传递它们的方法,我想像这样:

gunzip f1.gz, f2.gz | runprog -1 f1_input -2 f2_input

这是双倍吗?有没有办法解压缩两个文件并通过管道传递输出?

2 个答案:

答案 0 :(得分:3)

GNU gunzip有一个--stdout选项(又名。-c),就这个目的而言,@ slim指出也有zcat。结果输出连接成单个流,因为它是how pipes work。解决这个问题的一种方法是创建两个输入流并在runprog中单独处理它们。例如,以下是如何制作第一个文件输入流8和第二个输入流9:

runprog 8< <(zcat f1.gz) 9< <(zcat f2.gz)

另一种方法是将两个文件描述符作为参数传递给命令:

runprog <(zcat f1.gz) <(zcat f2.gz)

这两个参数现在可以像两个文件参数一样对待。

答案 1 :(得分:0)

你的程序应该理解zip文件有两个输入,你应该在两个文件之间有一个分隔符。

当您的程序获得分隔符时,您应该能够将输入分成两部分。因为管道可能会将您的两个输入文件都放在一个缓冲区中。