web-dev-qa-db-ja.com

出力を2つの異なるコマンドにパイプする

可能性のある複製:
osx/linux:pipes to two processes?

1つのコマンドからの出力を他の2つのコマンドの入力にパイプし、それらを同時に実行する方法はありますか?

このようなもの:

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

これを行いたいのは、USB SDRデバイスからFMラジオ信号を受信し、オーディオを生のPCMデータとして出力するプログラムがあるためです(.wavファイルのようですが、ヘッダーはありません)。信号は音楽がPOCSAGページャーデータの場合、それをデコーダープログラムにパイプしてページャーテキストを復元する必要があります。ただし、信号を聞きたいので、データが入ってくるかどうかがわかります。 (それ以外の場合、デコーダーが壊れているか、ブロードキャストされているデータがないかどうかはわかりません。)したがって、ページャーデコーダーにデータをパイプするだけでなく、同じデータをplayコマンドにパイプする必要があります。 。

現在私はそれを行う方法を知っています-それをデコーダにパイプして無音でデータを読み取るか、それをplayにパイプしてデコードされたテキストを表示せずにそれを聞きます。

同じデータを両方のコマンドにパイプして、テキストを読み、オーディオを聞くにはどうすればよいですか?

teeは重複したデータをファイルに書き込むだけなので使用できませんが、データをリアルタイムで処理する必要があります。

25
Malvineous

teemkfifoの両方を使用する場合は問題ありません。

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

名前のないパイプを介してそれを行う方法があります(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
12
F. Hauri

たぶんteeコマンドを見てください。入力をファイルに出力するだけですが、入力を標準出力に出力します。だから次のようなもの:

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

「Hello」という内容のファイルを作成し、<some_command>の引数としてhelloを渡します。