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

foo -o output.txt

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

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

推荐答案

Solution 1: Using process substitution

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

foo -o >(other_command)

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

Solution 2: Using named pipes explicitly

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

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

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

    other_command < my_buf
    
  3. 执行foo,让它将输出写入my_buf

    foo -o my_buf
    

Solution 3: Using /dev/stdout

您还可以使用设备文件/dev/stdout,如下所示

foo -o /dev/stdout | other_command

Linux相关问答推荐

如何删除字符串中的`{{i:`and `}}`

使用sed替换字符,但如果它是在bash csv文件中的字符串中,则不使用

Docker 默认使用交换文件吗?

如何摆脱管道分隔字段中不需要的管道符号 - Linux

根据其他列的值创建一个新列

如何使用换行符或制表符或空格 grep 多行字符串

如何在makefile中包含静态库

MessageBox 的 GTK 实现

如何优雅地退出 X11 事件循环?

kdevtmpfsi 使用整个 CPU

size_t 和 off_t 的用法有什么区别?

谁决定任何数据类型或 struct 的大小(取决于 32 位或 64 位)?

Linux上C中的标准输出线程安全?

如何显示正在运行的进程列表 Python?

如何以编程方式禁用硬件预取?

vscode 总是请求保存权限

PHP exec - 判断是否启用或禁用

sed - 如何使用 sed 进行正则表达式组

在类 Unix 系统中上次运行的 cron 作业(job)的详细信息?

使用 WGET 运行 cronjob PHP