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

Jak*_*ake 32 linux bash file-io stdout pipe

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

foo -o output.txt
Run Code Online (Sandbox Code Playgroud)

它写的唯一内容stdout是一条消息,表明它成功运行.我希望能够将写入的所有内容传递output.txt给另一个命令行实用程序.我的动机是output.txt的最终会被一个40 GB的文件,我不需要保留的,我宁愿管不是以逐步的方式对大量文件的工作流.

在这种情况下,有没有办法将实际输出(即output.txt)传递给另一个命令?我可以以某种方式神奇地传递stdout文件参数吗?

fra*_*nkc 48

命名管道工作正常,但是你可以通过bash进程替换获得更好,更直接的语法,它具有不使用必须在以后删除的永久命名管道的额外好处(进程替换在后台使用临时命名管道):

foo -o >(other command)

此外,如果要将输出通过管道输出到命令并将输出保存到文件,可以执行以下操作:

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


aio*_*obe 40

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

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

foo -o >(other_command)
Run Code Online (Sandbox Code Playgroud)

解决方案2:明确使用命名管道

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

  1. 使用该mkfifo命令创建命名管道.

    mkfifo my_buf
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用该文件作为输入启动另一个命令

    other_command < my_buf
    
    Run Code Online (Sandbox Code Playgroud)
  3. 执行foo并让它将输出写入my_buf

    foo -o my_buf
    
    Run Code Online (Sandbox Code Playgroud)

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

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

foo -o /dev/stdout | other_command
Run Code Online (Sandbox Code Playgroud)


Nes*_*iza 32

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

foo -o /dev/stdout
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案的问题在于,它*还*捕获命令的正常标准输出,如果它既发出不需要的标准输出*又*写入想要的文件,那么结果也将包含不需要的内容。 (2认同)

ktf*_*ktf 5

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

  1. 创建管道

    $ mknod -p mypipe
    
    Run Code Online (Sandbox Code Playgroud)
  2. 启动从管道读取的进程

    $ second-process < mypipe
    
    Run Code Online (Sandbox Code Playgroud)
  3. 启动进入管道的进程

    $ foo -o mypipe
    
    Run Code Online (Sandbox Code Playgroud)