Могу ли я взять выходной поток, дублировать его с помощью tee, мунге один из них, и передать оба обратно в качестве входных данных в diff?


В качестве примера возьмем stdout одной программы, получим две его копии с tee и отправим их оба (один или предпочтительно оба, способные передаваться по конвейеру через другие программы) обратно в vimdiff.

Бонусные очки, если это можно сделать без необходимости создавать файл на диске.

Я знаю, как направить вход в программу, которая принимает два входа, как это

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

И с тройником для создания двух выходных потоков

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

Но я не знаю, как соединить трубы. снова вместе в форме ромба.

2 3

2 ответа:

Это не так сложно, если вы можете использовать fifo:

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

Так же, как боковое Примечание, чтобы иметь эту работу под ZSH, после тройника требуется дополнительное " > " (опция multios должна быть установлена):

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