将stdout作为命令行util的文件名?

我正在使用一个命令行实用程序,它需要传递一个文件的名称来写输出,例如

foo -o output.txt 

它写入stdout的唯一信息是表示它已成功运行。 我希望能够将所有写入到output.txt所有内容都pipe理到另一个命令行实用程序。 我的动机是output.txt最终将成为一个40 GB的文件,我不需要保留,而且我宁愿pipestream而不是逐步处理大量文件。

在这种情况下有没有办法将实际输出(即output.txt )pipe道到另一个命令? 我可以以奇迹般的方式将stdout作为文件参数吗?

Solutions Collecting From Web of "将stdout作为命令行util的文件名?"

解决方案1:使用流程替换

这样做的最方便的方法是使用流程替换。 在bash中,语法如下所示:

 foo -o >(other_command) 

解决方案2:显式使用命名管道

您可以按照以下方式显式/手动执行上述操作:

  1. 使用mkfifo命令创建一个命名管道。

     mkfifo my_buf 
  2. 用这个文件作为输入启动你的其他命令

     other_command < my_buf 
  3. 执行foo ,让它把它的输出my_buf

     foo -o my_buf 

解决方案3:使用/dev/stdout

您也可以使用设备文件/dev/stdout如下

 foo -o /dev/stdout | other_command 

命名管道可以正常工作,但是通过bash进程替换可以获得更好,更直接的语法,这种替代具有不使用永久性命名管道的好处,后者必须稍后才会被删除(进程替换在后台使用临时命名管道):

foo -o >(other command)

另外,如果您想将输出传输到您的命令,并将输出保存到一个文件,您可以这样做:

foo -o >(tee output.txt) | other command

为了使stackoverflow高兴让我写一个足够长的句子,因为我建议的解决方案只有18个字符长,而不是所需的30+

 foo -o /dev/stdout 

你可以使用UNIX的魔力,并创建一个命名管道:)

  1. 创建管道

     $ mknod -p mypipe 
  2. 启动从管道读取的进程

     $ second-process < mypipe 
  3. 开始写入管道的过程

     $ foo -o mypipe 

我使用/ dev / tty作为输出文件名,相当于使用/ dev / nul /当你根本不想输出时。 然后| 你完成了。