我可以获取一个输出流,用 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 中吗?的主要内容,如果未能解决你的问题,请参考以下文章