如何通过管道输出需要文件参数的命令

Jim*_*mix 6 shell file pipe command-line-interface io-redirection

我知道您可以将一个命令的输出通过管道传输到另一个命令 - 例如

ls -la | less
Run Code Online (Sandbox Code Playgroud)

查看ls -la内部less而不是终端stdio的输出。

但是,如果您使用command带有将输出保存到文件的参数

command --save-to-file file.txt
Run Code Online (Sandbox Code Playgroud)

那么如何通过管道将其传递给另一个命令?

这种方式行不通:

command --save-to-file | less
Run Code Online (Sandbox Code Playgroud)

因为命令会抱怨你使用--save-to-file没有任何参数(文件名)

如果我记得很清楚,在 ram 中有一个缓冲区或临时文件之类的东西,您可以将其放入而不是file.txt这样您可以执行以下操作:

command --save-to-file ram-buffer.txt && cat ram-buffer.txt
Run Code Online (Sandbox Code Playgroud)

甚至无需在磁盘上创建文件,对吗?

为什么我需要那个?

一些命令只有一个基本的输出到 stdio 并且更有用的输出类型不能被它们打印而只能保存到文件中。问题是我根本不想将更有用的输出类型保存到任何文件,而只是在终端或管道中将其打印到另一个执行过滤等的命令链,然后最终打印处理后的输出。

我不想负责创建一个 tmp 文件然后删除它等等。完美地我只想使用一种魔法文件(或重定向)来代替file.txt我可以通过管道传输到另一个命令的文件。

如果可能的话,不要将输出的任何内容写入磁盘,这对我来说很重要。只需在终端或管道中将其打印到其他命令即可。

此时我正在尝试捕获 PHPUnit 的输出

phpunit --log-junit log.xml
Run Code Online (Sandbox Code Playgroud)

这不是一个 shell 命令,而是一个 PHP 脚本,它使用:

#!/usr/bin/env php
Run Code Online (Sandbox Code Playgroud)

但是我记得我曾经有一个带有 linux 命令的示例,我想获取输出但它的形式只能通过参数获得 --save-to-file outputfile.txt

也许是因为管道/重定向设计为保存到文件的输出不是二进制安全的,因此在管道/重定向时这样的输出可能会损坏 - 可以吗?

Joh*_*ica 4

有些程序对-. 例如,您可以告诉tar写入标准输出,以便可以在管道中使用它。这将在本地创建一个 tarball 并远程解压它,而无需将 tarball 写入磁盘:

tar -cf - *.txt | ssh user@host tar -C /dir/ -xf -
Run Code Online (Sandbox Code Playgroud)

您可以/dev/stdout与几乎所有程序一起使用,只要它们不需要可查找文件即可。

command --save-to-file /dev/stdout
Run Code Online (Sandbox Code Playgroud)