Передача по конвейеру двум различным командам

Возможный дубликат:
OSX / Linux: трубы в два процесса?

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

Что-то вроде этого:

$ echo 'test' |(cat) |(cat)
test
test

Причина, по которой я хочу это сделать, заключается в том, что у меня есть программа, которая принимает FM-радиосигнал от устройства USB SDR и выводит звук в виде необработанных данных PCM (например, файла.wav, но без заголовка). Поскольку сигнал не музыка, но данные пейджера POCSAG, мне нужно передать их в программу декодера для восстановления текста пейджера. Однако я также хочу прослушать сигнал, чтобы знать, поступают ли какие-либо данные или нет. (В противном случае я не могу сказать, сломан ли декодер или нет данных, которые передаются в эфир.) Поэтому, помимо передачи данных в декодер пейджера, мне также нужно передать те же данные в play команда.

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

Как я могу передать одни и те же данные обеим командам, чтобы я мог читать текст и слышать звук?

Я не могу использовать tee поскольку он только записывает дублированные данные в файл, но мне нужно обрабатывать данные в режиме реального времени.

3 ответа

Решение

Это должно быть хорошо, если вы используете оба tee а также mkfifo,

mkfifo pipe
cat pipe | (command 1) &
echo 'test' | tee pipe | (command 2)

Есть способ сделать это через безымянный канал (протестировано под Linux):

 (( echo "hello" |
         tee /dev/fd/5 |
             sed 's/^/1st occure: /' >/dev/fd/4
    ) 5>&1 |
    sed 's/^/2nd command: /'
 ) 4>&1

дать:

2nd command: hello
1st occure: hello

Этот образец позволит вам скачать somefile.ext, сохраните их, вычислите его md5sum и вычислите его sha1sum:

(( wget -O - http://somewhere.someland/somepath/somefile.ext |
    tee /dev/fd/5 |
    md5sum >/dev/fd/4
  ) 5>&1 |
  tee somefile.ext |
  sha1sum
) 4>&1

Может быть, взглянуть на tee команда. То, что он делает, просто печатает свои входные данные в файл, но он также печатает свои входные данные в стандартный вывод. Так что-то вроде:

echo "Hello" | tee try.txt | <some_command>

Создаст файл с содержимым "Hello" И передаст привет в качестве аргумента <some_command>,

Другие вопросы по тегам