35

重複の可能性:
osx/linux: 2 つのプロセスにパイプしますか?

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

このようなもの:

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

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

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

テキストを読んで音声を聞くことができるように、同じデータを両方のコマンドにパイプするにはどうすればよいですか?

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

4

3 に答える 3

40

teeと の両方を使用すれば問題ありませんmkfifo

mkfifo pipe
cat pipe | (command 1) &
echo 'test' | tee pipe | (command 2)
于 2012-10-28T09:51:11.977 に答える
23

最近のの現在の>(command)構文:

echo "Hello world." | tee >(sed 's/^/1st: /')  >(sed 's/^/2nd cmd: /') >/dev/null

戻る可能性があります:

2nd cmd: Hello world.
1st: Hello world.

をダウンロードsomefile.extして保存し、md5sum と sha1sum を計算します。

wget -O - http://somewhere.someland/somepath/somefile.ext |
    tee somefile.ext >(md5sum >somefile.md5) | sha1sum >somefile.sha1

また

wget -O - http://somewhere.someland/somepath/somefile.ext |
    tee >(md5sum >somefile.md5) >(sha1sum >somefile.sha1) >somefile.ext

古い答え

名前のないパイプを介してそれを行う方法があります(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
于 2012-10-28T10:48:55.837 に答える
5

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

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

内容が「Hello」のファイルを作成し、「Hello」(パイプラインを流れる) を<some_command>STDIN として終了させます。

于 2012-10-28T09:46:34.000 に答える