如何将需要文件参数的命令的输出传输到另一个命令中?

6

我知道你可以将一个命令的输出导入到另一个命令中,例如

ls -la | less

ls -la的输出结果在less中查看,而不是在终端stdio中。

但如果您使用一个带有参数的命令来将输出保存到文件中。

command --save-to-file file.txt

那么如何将其导向另一个命令呢? 这种方式行不通:
command --save-to-file | less

因为命令会抱怨你使用了 --save-to-file 却没有任何参数(文件名)。如果我没记错,有一个缓冲区或者临时文件可以代替 file.txt,这样你就可以做到以下操作:
command --save-to-file ram-buffer.txt && cat ram-buffer.txt

不需要在硬盘上创建文件,是这样吗?

为什么我需要这个?

有些命令只能将基础输出打印到stdio中,而更有用的类型的输出不能被打印,只能保存到文件中。问题是我根本不感兴趣将更有用的输出保存到任何文件中,而只是想要将其打印在终端上或者管道传递给其他过滤器命令等进行处理,最后再打印出处理后的输出。

我不想负责创建一个临时文件,然后再删除它等操作。完美的话,我希望只使用一种魔法文件(或重定向),来代替file.txt,以便我可以将其传递给另一个命令。

对我来说很重要的一点是,如果可能的话,请不要将任何输出内容写入磁盘,只需将其打印在终端上或者管道传递给其他命令。

目前,我正在尝试捕获PHPUnit的输出。

phpunit --log-junit log.xml

这不是一个shell命令,而是一个使用以下内容的PHP脚本:

#!/usr/bin/env php

但我记得我曾经有一个Linux命令的例子,我想获取输出,但它只能通过参数--save-to-file outputfile.txt以特定形式获得。

可能是因为将本来设计用于保存到文件的输出进行管道化/重定向不是二进制安全的,因此此类输出在进行管道化/重定向时可能会损坏 - 是这样吗?


你有没有一个命令的例子,只有在输出到文件时才透露额外信息?确切的语法是什么,像 cmd -f output.txt 这样吗,还是像 cmd --save-to-file 这样没有参数? - Benjamin W.
@BenjaminW。cmd --save-to-file output.txt 我已经在问题的编辑中提供了更多信息。 - Jimmix
在Bash中,您可以将内容写入伪文件/dev/stdout而不是output.txt - Benjamin W.
如果所涉及的命令没有易于理解(甚至是默认的)写入stdout的机制,第一步是提交错误报告。 - William Pursell
2个回答

4

有些程序对-有特殊处理。例如,您可以告诉tar将文件写入标准输出流,以便在管道中使用。这样就可以在本地创建一个 tar 包并在远程解压缩,而无需将 tar 包写入磁盘:

tar -cf - *.txt | ssh user@host tar -C /dir/ -xf -

你可以在几乎所有程序中使用/dev/stdout,只要它们不需要一个可寻址的文件。
command --save-to-file /dev/stdout

命令 command --save-to-file /dev/stdout 完成了任务。我使用了 phpunit --stderr --log-junit /dev/stdout | tail +3 | less 命令,并使用 tail +3 获取 XML 内容,因为 PHPUnit 在文件开头抱怨 "Warning: fopen(/dev/stdout): failed to open stream: No such file or directory ...",但之后它给了我想要的内容,而不需要写入任何文件。 - Jimmix

1
正如评论中@Benjamin W.所指出的,您可以将其保存到/dev/stdout,这是输出,然后将输出管道传输到您想要的任何地方(例如less)。
command --save-to-file /dev/stdout | less

请注意,标准输出可能会有额外的输出。在这种情况下,您可以将其丢弃、保存到stderr并重定向到stdout

command --save-to-file /dev/stderr >/dev/null 2>/dev/stdout | less

如果同时使用stderrstdout,您可以编写自己的驱动程序或操作/proc/pid/mem等内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接