Есть ли способ передать вывод одной программы в две другие программы?

Извините, если это глупый вопрос, но я пытаюсь выполнить что-то подобное, но в одной строке:

$ prog1 | prog2
$ prog1 | prog3

Итак, я в основном хочу выполнить prog1 и транслировать вывод на prog2 и prog3 отдельно (не на цепочку). Сначала я пытался использовать тройник, но это выглядело не так, потому что он выгружал вывод в файл (это не то, что я хочу).

$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"

В какой-то момент я, вероятно, захочу расширить это, чтобы передать вывод в более чем две программы, но сейчас я просто начинаю просто.

$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
27 голосов | спросил longda 8 J0000006Europe/Moscow 2012, 05:13:52

4 ответа


26

Замена процесса.

... | tee >(prog2) | ...
ответил Ignacio Vazquez-Abrams 8 J0000006Europe/Moscow 2012, 05:26:19
16

Как и в ответ Игнасио, вы можете использовать временный именованный канал, используя mkfifo(1).

mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$

Это немного более подробный, но он будет работать на системах, которые не имеют подстановки процесса, например dash. sleep 1 предназначен для обработки любых условий гонки.

ответил Arcege 8 J0000006Europe/Moscow 2012, 06:02:11
5

Существует небольшая утилита ptee , которая выполняет задание:

prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)

Вместо записи в файлы, ptee записывает все fds, которые указаны в командной строке.

ptee является частью pipexec .

ответил Andreas Florath 5 PMpSat, 05 Apr 2014 16:37:19 +040037Saturday 2014, 16:37:19
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 совпадений процессов.

ответил mikeserv 6 AMpSun, 06 Apr 2014 00:31:22 +040031Sunday 2014, 00:31:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132