Ответ 1
Это должно быть хорошо, если вы используете как tee
, так и mkfifo
.
mkfifo pipe
cat pipe | (command 1) &
echo 'test' | tee pipe | (command 2)
Возможный дубликат:
osx/linux: трубы в два процесса?
Есть ли способ передать вывод из одной команды на вход двух других команд, запуская их одновременно?
Что-то вроде этого:
$ echo 'test' |(cat) |(cat)
test
test
Причина, по которой я хочу сделать это, заключается в том, что у меня есть программа, которая принимает FM-радиосигнал с устройства SDR USB и выводит аудио как необработанные данные PCM (например, файл .wav, но без заголовка). Поскольку сигнал - это не музыка, а данные пейджера POCSAG, мне нужно передать его в программу декодера, чтобы восстановить текст пейджера. Однако я также хочу слушать сигнал, поэтому я знаю, поступают ли какие-либо данные или нет. (В противном случае я не могу определить, нарушен ли декодер или нет только данных, которые транслируются.) Так же, как и передача данных в пейджер-декодер, мне также нужно передать те же данные команде play
.
В настоящее время я знаю только, как это сделать: либо подключить его к декодеру, либо прочитать данные в тишине, либо передать его на play
и прослушать, не видя никакого декодированного текста.
Как я могу передать те же данные обеим командам, чтобы я мог читать текст и слышать звук?
Я не могу использовать tee
, поскольку он только записывает дублированные данные в файл, но мне нужно обрабатывать данные в режиме реального времени.
Это должно быть хорошо, если вы используете как 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>
.