我正在使用命令行实用程序,该实用程序需要传递文件名以将输出写入,例如
foo -o output.txt
它写给stdout
的唯一内容是一条消息,表明它已成功运行。我希望能够将写入output.txt
的所有内容传递给另一个命令行实用程序。我的动机是output.txt将最终成为一个我不需要保留的40 GB文件,而且我宁愿管道流而不是以逐步的方式处理大量文件。
在这种情况下,有没有办法将实际输出(即output.txt
)传递给另一个命令?我可以以某种方式神奇地传递stdout
作为文件参数吗?
答案 0 :(得分:48)
命名管道工作正常,但是你可以通过bash进程替换获得更好,更直接的语法,它具有不使用永久命名管道的额外好处,以后必须删除它(进程替换在后台使用临时命名管道) :
foo -o >(other command)
此外,如果您想将输出通过管道传输到命令并将输出保存到文件中,您可以这样做:
foo -o >(tee output.txt) | other command
答案 1 :(得分:34)
最方便的方法是使用进程替换。在bash中,语法如下所示:
foo -o >(other_command)
您可以如下显式/手动执行上述操作:
使用mkfifo
命令创建命名管道。
mkfifo my_buf
使用该文件作为输入启动另一个命令
other_command < my_buf
执行foo
并将其输出写入my_buf
foo -o my_buf
/dev/stdout
您还可以使用设备文件/dev/stdout
,如下所示
foo -o /dev/stdout | other_command
答案 2 :(得分:31)
为了让stackoverflow高兴,让我写一个足够长的句子,因为我提出的解决方案只有18个字符而不是所需的30 +
{{1}}
答案 3 :(得分:5)
您可以使用UNIX的魔力并创建命名管道:)
创建管道
$ mknod -p mypipe
启动从管道中读取的过程
$ second-process < mypipe
启动写入管道
的过程$ foo -o mypipe
答案 4 :(得分:1)
我使用/ dev / tty作为输出文件名,相当于使用/ dev / nul /什么时候什么都不输出。然后|你完成了。
答案 5 :(得分:0)
Query
如果由于某种原因您无权写入 foo -o <(cat)