我可以获取一个输出流,用 tee 复制它,将其中一个复制出来,然后将两者作为输入返回到 diff 中吗?

Posted

技术标签:

【中文标题】我可以获取一个输出流,用 tee 复制它,将其中一个复制出来,然后将两者作为输入返回到 diff 中吗?【英文标题】:Can I take an output stream, duplicate it with tee, munge one of them, and pipe BOTH back as input into diff? 【发布时间】:2013-05-31 23:29:02 【问题描述】:

例如,获取一个程序的标准输出,使用tee 获取它的两个副本,然后将它们(一个或最好两个都能够通过其他程序通过管道传输)发送回vimdiff

如果无需在磁盘上创建文件即可完成,则可加分。

我知道如何将输入直接输入到需要两个输入的程序中,像这样

vimdiff <(curl http://google.com) <(curl http://archives.com/last_night/google.com)

和 tee 用于制作两个输出流

echo "abc" | tee >(sed 's/a/zzz/') >(sed 's/c/zzz/')

但我不知道如何将管道重新连接成菱形。

【问题讨论】:

查看 mkfifo 命令,它的目的是按照我认为您的描述进行操作。 太棒了!终于找到一个我隐约知道但从未使用过的东西的用途真是太酷了。谢谢。 @NSD 这个问题是出于好奇。但是使用 FIFO 来完成我最初的任务会有点傻。我正在处理文件,所以我只是引用了这些文件。我只是在想“如果我只有一个流并且它还没有保存在文件中怎么办”。 有人应该写一个答案,也许可以举一个简短的例子来说明如何在单行中使用mkfifo 制作和使用fifos。我会接受这样的废话。 @StevenLu 谢谢,现在我明白了这个场景....实际上,当我在问题....根据我的概念,管道在单个指令中使用,即提供一个命令的输出作为后面命令的输入,而您的问题让我想到了以另一种方式反转所有内容! .... 【参考方案1】:

如果你可以使用fifo,那就没那么难了:

test -e fifo || mkfifo fifo
echo abc | tee >(sed s/a/zzz/ > fifo) | sed s/c/zzz/ | diff - fifo

【讨论】:

【参考方案2】:

顺便说一句,要在 ZSH 下进行这项工作,在 tee 之后需要一个额外的“>”(应该设置 multios 选项):

$ setopt multios
$ test -e fifo || mkfifo fifo
$ echo abc | tee > >(sed s/a/zzz/ > fifo) | sed s/c/zzz/ | diff - fifo

【讨论】:

以上是关于我可以获取一个输出流,用 tee 复制它,将其中一个复制出来,然后将两者作为输入返回到 diff 中吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用子进程时如何在 Python 中复制 tee 行为?

FFMPEG tee muxer 给出“输出文件 #0 不包含任何流”

显示程序输出并复制到文件(tee 命令)

如果我将输出通过管道传输到 tee,则无法“继续”

shell中的tee命令的使用

tee命令