一尘不染

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

linux

我正在使用命令行实用程序,该实用程序需要传递文件名以将输出写入例如

foo -o output.txt

它写入的唯一内容stdout是一条消息,指示其已成功运行。我希望能够将写入output.txt到另一个命令行实用程序的所有内容通过管道传输。我的动机是output.txt最终将是一个40
GB的文件,不需要保留,我宁愿通过管道传输流,也不能以逐步的方式处理大量文件。

在这种情况下,有什么方法可以将实际输出(即output.txt)传递给另一个命令?我能以某种方式神奇地通过stdoutfile参数吗?


阅读 173

收藏
2020-06-02

共1个答案

一尘不染

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

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

foo -o >(other_command)

(请注意,这是一种bashism。对于其他shell,也有类似的解决方案,但最重要的是,它不可移植。)

解决方案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
2020-06-02