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
/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