однострочный с 2 TMP файлов (не то, что вы хотите) будет:
foo | bar > file1.txt && baz | quux > file2.txt && diff file1.txt file2.txt
С Баш, вы можете попробовать, хотя:
diff <(foo | bar) <(baz | quux)
foo | bar | diff - <(baz | quux) # or only use process substitution once
2-й версии будет больше наглядно напоминаю вам, какой вход был, показывая
-- /dev/stdin
против ++ /dev/fd/63
или что-то в этом духе вместо двух пронумерованных фс.
Даже не именованный канал появится в файловой системе, по крайней мере, на платформах, где Баш можно реализовать замену процесса с использованием имен файлов, как /dev/fd/63
, чтобы получить имя файла, которое команда может открыть и прочитать из фактически прочитанных из уже открытый файловый дескриптор, который bash настроил перед выполнением команды. (Т.е. Баш использует pipe(2)
перед вилкой, а затем dup2
перенаправлять с выходом quux
в дескриптор входного файла для diff
, на дескрипторе 63.)
В системе с не «волшебным» /dev/fd
или /proc/self/fd
, Баш может использовать именованные каналы для реализации замещения процесса, но, по крайней мере, они будут управлять ими самими, в отличие от временных файлов, и ваши данные не будут записаны в файловую систему.
Вы можете проверить, как bash реализует замену процесса с помощью echo <(true)
, чтобы напечатать имя файла, а не читать из него. Он печатает /dev/fd/63
в типичной системе Linux. Или для более подробной информации о точно, что системные вызовы Баш использует эту команду в системе Linux будет отслеживать файл и системный файл-дескриптор вызывает
strace -f -efile,desc,clone,execve bash -c '/bin/true | diff -u - <(/bin/true)'
Без Баш, вы могли бы сделать именованный канал.Используйте -
сказать diff
читать один вход из STDIN, и использовать именованный канал, как и другие:
mkfifo file1_pipe.txt
foo|bar > file1_pipe.txt && baz | quux | diff file1_pipe.txt - && rm file1_pipe.txt
Обратите внимание, что вы можете только труба один выход к несколько входов с командой тройник :
ls *.txt | tee /dev/tty txtlist.txt
Вышеприведенные команда отображает выход Ls * .txt к терминалу и выводит его в текстовый файл txtlist.txt.
Но с подменой процесса, вы можете использовать tee
кормить одни и те же данные в несколько трубопроводов:
cat *.txt | tee >(foo | bar > result1.txt) >(baz | quux > result2.txt) | foobar
Даже без bash вы можете использовать временные fifo's `mkfifo a; cmd> a & cmd2 | diff a -; rm a` – unhammer 2013-06-10 10:49:47
Вы можете использовать регулярный канал для одного из аргументов: `pip1 | diff -u - <(конвейер2) `. Тогда вывод будет более четко напоминать вам, какой вход был, который, показывая `-/dev/stdin` против` ++/dev/fd/67` или что-то, вместо двух пронумерованных fds. – 2018-03-05 04:36:33