将 stdout 作为命令行实用程序的文件名传递?
- 2024-11-07 08:55:00
- admin 原创
- 29
问题描述:
我正在使用一个命令行实用程序,它需要传递要写入输出的文件的名称,例如
foo -o output.txt
它唯一写入的stdout
是一条表明它已成功运行的消息。我希望能够将写入的所有内容传输到output.txt
另一个命令行实用程序。我的动机是 output.txt 最终将是一个我不需要保留的 40 GB 文件,我宁愿将流传输到管道,也不愿逐步处理大量文件。
在这种情况下,有什么方法可以将实际输出(即output.txt
)传送到另一个命令吗?我能以某种方式神奇地将其stdout
作为文件参数传递吗?
解决方案 1:
解决方案 1:使用进程替换
最方便的方法是使用进程替换。在 bash 中,语法如下:
foo -o >(other_command)
(请注意,这是一种bashism。其他 shell 也有类似的解决方案,但底线是它不可移植。)
解决方案 2:明确使用命名管道
您可以按如下方式明确/手动执行上述操作:
使用
mkfifo
命令创建一个命名管道。
mkfifo my_buf
使用该文件作为输入启动其他命令
other_command < my_buf
执行
foo
并让其将其输出写入my_buf
foo -o my_buf
解决方案 3:使用/dev/stdout
/dev/stdout
您还可以按如下方式使用设备文件
foo -o /dev/stdout | other_command
解决方案 2:
命名管道工作得很好,但是你可以通过 bash 进程替换获得更漂亮、更直接的语法,它还有一个好处,就是不使用以后必须删除的永久命名管道(进程替换在后台使用临时命名管道):
foo -o >(other command)
此外,如果您希望将输出通过管道传输到命令并将输出保存到文件,您可以执行以下操作:
foo -o >(tee output.txt) | other command
解决方案 3:
为了让 stackoverflow 满意,我写了一个足够长的句子,因为我提出的解决方案只有 18 个字符,而不是要求的 30 多个字符
foo -o /dev/stdout
解决方案 4:
您可以使用 UNIX 的魔力并创建一个命名管道:)
创建管道
$ mknod -p mypipe
启动从管道读取的进程
$ second-process < mypipe
启动写入管道的进程
$ foo -o mypipe
解决方案 5:
我使用 /dev/tty 作为输出文件名,相当于当您想不输出任何内容时使用 /dev/nul/。然后按 | 就完成了。
解决方案 6:
foo -o <(cat)
如果出于某种原因你没有权限写信给/dev/stdout
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件