将文件传输到未实现管道的命令

将文件传输到未实现管道的命令
$ cat foo
foo
bar

现在如果我这样做:

$ some_program foo

它正在发挥作用。

但如果我尝试:

$ cat foo | some_program

它不起作用。

我正在寻找一种干净的方式来将输入传输到some_program 没有必须使用混乱的临时文件。

答案1

管道将把cat foo的标准输出放到some_program的标准输入中。在这种情况下some_program需要一个参数,而不是标准输入,因此您需要将cat foo的结果存储到变量中,然后调用some_program $variable

我不太确定 bash 脚本,但是可以尝试一下吗?

bar=`cat foo`
some_program $bar

事实上,这也许会起作用...

some_program `cat foo`

答案2

在 bash 中你可以使用进程替换

$ some_program <(cat foo)

您可以通过这种方式添加任意数量的参数,只要您知道这些参数将是只读的文件名即可。您不能同时读取和写入。

答案3

除了@Bob提出的方法之外,还有另一种更灵活的方法xargs::

你可以使用

cat foo | xargs some_program

这基本上相当于

some_program `cat foo`

如果程序每次只需要一个参数,你可以这样做

cat foo | xargs -n 1 some_program

并且some_program每输入一行都会被调用一次。

还有许多其他选项xargs,例如小心处理“坏”文件名(带有空格和其他特殊字符)、限制同时运行的进程数等,这些可以在手册页中找到。

相关内容