linux - 将标准输出作为命令行工具的文件名传递?

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

foo -o output.txt

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

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

最佳答案

解决方案 1:使用 process substitution

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

foo -o >(other_command)

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

解决方案 2:使用 named pipes明确

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

  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

https://stackoverflow.com/questions/7756609/

相关文章:

linux - 使用 ssh 检查远程主机上是否存在文件

php - 使路径在 linux 和 Windows 上都有效

linux - 如何安排 tcpdump 在特定时间段内运行?

linux - 无法在 Ubuntu 16.04 中启动 Docker 服务

linux - 从标准输出中获取输出的最后 4 个字符

java - 无法创建Java虚拟机

linux - 当命令太长时,命令行会自动覆盖

linux - 如何将 bash 别名定义为多个命令的序列?

linux - 须藤 : docker-compose: command not found

linux - 将时间跨度(以秒为单位)转换为 shell 中的格式化时间