将多个文件的内容馈送到脚本的stdin的简写


20

假设我有一个名为的脚本script,该脚本读取stdin一些结果并将其吐出到屏幕上。

如果要向其提供一个文件的内容,请输入:

$ ./script < file1.txt

但是,如果我想将多个文件的内容以相同的方式提供给脚本,那有可能吗?到目前为止,我想到的最好的方法是:

cat file1.txt file2.txt > combined.txt && ./script < combined.txt

它使用两个命令并创建一个临时文件。有没有办法做同样的事情,但绕开创建合并文件?


切换到zsh您就可以运行cmd <file1 <file2 ... <fileN;)
don_crissti

Answers:


20

您可以使用cat和管道:

cat file1 file2 file3 ... fileN | ./script

您的示例使用管道,没有临时文件:

join file1.txt file2.txt | ./script

天啊 如此简单,我什至不确定自己是如何意识到的。谢谢!
0x4B1D 2011年


4
@Bruce Ediger:我想您只是在join没有临时文件的情况下指出一种使用方法,只是为了向读者说明: cat f1 f2join f1 f2
Peter.O 2011年

@fred感谢您指出这一点-我join在示例中使用该代码是因为我之前在玩它;实际上,以我的示例为例cat
0x4B1D 2011年

10

如果您不想使用管道,则可以将输入重定向与进程替换一起使用:

./script <(cat file1 file2)

3

要添加@Jonah Braun的答案,如果您还需要将过程输出也添加到脚本中,即您的文件可能不在磁盘上,而是URL使用curl或类似工具访问的。

这样的东西可以用来获取stdout多个进程,并通过脚本在脚本中使用它们stdin

这将是用于处理以下内容的脚本multi-input.sh

#!/usr/bin/env bash
while read line; do
    echo $line
done

现在测试一下:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

输出:

process 1
process 2
process 3

<()如果愿意,可以将过程转换为虚拟file使用fd,因此<需要阅读它。cat本身并不需要它,因为它可以做到,将虚拟或真实文件串联在一起。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.