从 stdout 重定向或管道创建临时文件

Vin*_*eib 7 shell pipe io-redirection

有些命令只输出到标准输出。
某些工具仅适用于文件。
有没有可以将它们粘合在一起的命令?

人为简单的例子:

diff $(echo 1 | stdout-to-temp-file) $(echo 2 | stdout-to-temp-file)

我的实际用例;当前的解决方法:

git show HEAD:$1 > /tmp/left && meld /tmp/left $1

我的实际用例;期望:

meld $(git show HEAD:$1 | stdout-to-temp-file) $1

我也会在其他一些情况下使用它(即我不是在寻找 git 或 meld only fix)。

rah*_*hmu 13

您可以使用<将输出重定向到stdin.

我不知道如何meld工作,但关于你的差异示例,它是如何工作的:

使用临时文件

$ cmd1 > file1.tmp
$ cmd2 > file2.tmp
$ diff file1.tmp file2.tmp
Run Code Online (Sandbox Code Playgroud)

没有临时文件

$ diff <(cmd1) <(cmd2)
Run Code Online (Sandbox Code Playgroud)

请注意,根据您使用的 shell(我使用的是 ksh88),语法可能会有所不同。

  • +1,但这不是重定向。它是 [进程替换](http://tldp.org/LDP/abs/html/abs-guide.html#PROCESS-SUB) ...进程替换使用 /dev/fd/&lt;n&gt; ... 例如` gedit &lt;(echo Hello)` 将打开一个名为 `63` 或类似 `fd` 编号的文件,并且发送到 stdout 的“Hello”只会消失在该进程的位桶中,因为 `gedit`不接受标准输入,例如`echo Hello | gedit`。 (4认同)

Sha*_*off 9

mktemp将为您创建一个临时文件名。将文件名保存在一个变量中,并在两个插槽中使用它。

要为您的精确问题提供更好的解决方案,请查看git difftool。我有使用 meld 的设置,它非常棒。