$ 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
,例如小心处理“坏”文件名(带有空格和其他特殊字符)、限制同时运行的进程数等,这些可以在手册页中找到。