Передача по конвейеру двум различным командам
Возможный дубликат:
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>
,