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

Linux 是否将stdout作为命令行util的文件名传递?,linux,bash,file-io,stdout,pipe,Linux,Bash,File Io,Stdout,Pipe,我正在使用一个命令行实用程序,它需要传递要将输出写入的文件名,例如 foo -o output.txt 它写入标准输出的唯一内容是一条消息,指示它已成功运行。我希望能够将写入output.txt的所有内容通过管道传输到另一个命令行实用程序。我的动机是output.txt最终将成为一个40 GB的文件,我不需要保留它,我宁愿通过管道传输数据流,也不愿以逐步方式处理大量文件 在这种情况下,有没有办法将实际输出(即output.txt)通过管道传输到另一个命令?我可以神奇地将stdout作为文件参数

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

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

在这种情况下,有没有办法将实际输出(即
output.txt
)通过管道传输到另一个命令?我可以神奇地将
stdout
作为文件参数传递吗?

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

foo -o >(other_command)
(请注意,这是一个很好的解决方案。其他shell也有类似的解决方案,但底线是它不可移植。)

解决方案2:显式使用 您可以按如下方式显式/手动执行上述操作:

foo -o >(other_command)
  • 使用
    mkfifo
    命令创建命名管道

    mkfifo my_buf
    
  • 以该文件作为输入启动其他命令

    other_command < my_buf
    
  • 解决方案3:使用
    /dev/stdout
    您还可以使用设备文件
    /dev/stdout
    ,如下所示

    foo -o /dev/stdout | other_command
    

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

  • 创建管道

    $ mknod -p mypipe
    
  • 启动从管道中读取数据的进程

    $ second-process < mypipe
    

  • 命名管道工作正常,但通过bash process substitution,您可以使用更好、更直接的语法,该语法的另一个好处是不使用以后必须删除的永久命名管道(process substitution在幕后使用临时命名管道):

    foo-o>(其他命令)

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


    foo-o>(tee output.txt)|其他命令

    我使用/dev/tty作为输出文件名,相当于在您不想输出任何内容时使用/dev/nul/。那么|你就完成了。

    为了让stackoverflow开心,让我写一个足够长的句子,因为我建议的解决方案只有18个字符,而不是要求的30个字符+

    foo -o /dev/stdout
    

    foo-o一些unix/linux版本可以通过
    /dev/stdout
    等访问stdout/err。unixy工具通常的“写入stdout”约定是使用
    -
    作为文件名(即
    foo-o-
    )。在代码中,您可以简单地检测到该特殊文件名,并使用
    stdout
    作为输出,而不是
    fopen
    ed文件。在这种情况下,不要打印状态,也不要将状态打印到可以单独重定向的
    stderr
    。所有优秀的建议都能深入了解问题的各个方面。我认为命名管道是可行的,但这两个答案本质上是重复的——我应该将哪一个标记为答案?tty并不总是可用的。更好地使用/dev/stdout此解决方案的问题是,它还捕获命令的正常stdout,如果它同时发出不需要的stdout并写入需要的文件,那么结果也将包含不需要的内容。
    foo -o /dev/stdout