
Извините, если это глупый вопрос, но я пытаюсь сделать что-то вроде этого, но в одну строку:
$ prog1 | prog2
$ prog1 | prog3
Итак, я в основном хочу выполнить prog1 и передать вывод в prog2 и prog3 по отдельности (не цепной конвейер). Сначала я пытался использовать tee, но это показалось мне неправильным, потому что вывод выводился в файл (что мне не нужно).
$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"
В какой-то момент я, вероятно, захочу расширить это и передать вывод более чем двум программам, но сейчас я начинаю с простого.
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
решение1
Замена процесса.
... | tee >(prog2) | ...
решение2
Подобно ответу Игнасио, вы можете использовать временный именованный канал, используя mkfifo(1)
.
mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$
Он немного более многословен, но будет работать в системах, в которых нет подстановки процессов, например dash
. Он sleep 1
должен обрабатывать любые состояния гонки.
решение3
Есть небольшая утилитаптээкоторый выполняет эту работу:
prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)
Вместо записи в файлы,птээзаписывает во все fd, указанные в командной строке.
птээчастьpipexec.
решение4
Вам не нужны никакие башизмы, специальные файлы или что-то подобное — по крайней мере, в Linux:
% { prog1 | tee /dev/fd/3 | prog2 >&2 ; } 3>&1 | prog3
{ { printf %s\\t%s\\t%s\\n \
"this uneven argument list" \
"will wrap around" to \
"different combinations" \
"for each line." "Ill pick out" \
"a few words" "and grep for them from" \
"the same stream." |
tee /dev/fd/3 /dev/fd/4 |
grep combination >&2 ; } 3>&1 |
grep pick >&2 ; } 4>&1 |
grep line
different combinations for each *line.* Ill pick out
different combinations for each line. Ill *pick* out
different *combinations* for each line. Ill pick out
Я пометил звездочкой выделенные мной результаты, grep
чтобы показать, что это не только три результата из одного потока, но и результаты отдельных grep
процессов сопоставления.