Подтвердить что ты не робот

Вывод трубы на две разные команды

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 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

Ответ 3

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

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

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