Чи є спосіб передати висновок однієї програми на дві інші програми?


28

Вибачте, якщо це дурне питання, але я намагаюся здійснити щось подібне, але в одному рядку:

$ prog1 | prog2
$ prog1 | prog3

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

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

У якийсь момент я, мабуть, хотів би поширити це на перенесення результатів на більш ніж дві програми, але я зараз тільки починаю просту.

$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...

Я думаю, що zsh може це зробити.
Кіт

Відповіді:



16

Подібно до відповіді Ігнасіо, ви можете використовувати тимчасову трубку з назвою mkfifo(1).

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

Це трохи більш багатослівно, але він би працював у системах, які не мають підстановки процесів, як dash. Це sleep 1обробляти будь-які умови перегонів.


6

Є невелика комунальна служба, яка виконує цю роботу:

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

Замість того, щоб писати у файли, ptee записує у всі FDS, які вказані в командному рядку.

PTEE є частиною 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матчів процесу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.