管道输出到两个不同的命令

时间:2012-10-28 09:45:03

标签: bash pipe tee

  

可能重复:
  osx/linux: pipes into two processes?

有没有办法将输出从一个命令输入到另外两个命令的输入中,同时运行它们?

这样的事情:

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

我想这样做的原因是我有一个程序从USB SDR设备接收FM无线电信号,并将音频输出为原始PCM数据(如.wav文件,但没有标题。)信号不是音乐而是POCSAG寻呼机数据,我需要将它传送到解码器程序以恢复寻呼机文本。但是我也想听信号,所以我知道是否有任何数据进入。 (否则我无法判断解码器是否损坏或者没有广播数据。)因此,除了将数据传输到寻呼机解码器之外,我还需要将相同的数据传输到play命令。

目前我只知道如何做一个 - 将其传输到解码器并静默读取数据,或将其传输到play并听到它而不会看到任何已解码的文本。

如何将相同数据传输到两个命令,以便我可以阅读文本并听到音频?

我无法使用tee,因为它只将重复数据写入文件,但我需要实时处理数据。

3 个答案:

答案 0 :(得分:27)

如果同时使用teemkfifo,则应该没问题。

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

答案 1 :(得分:11)

有一种方法可以通过未命名的管道(在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

答案 2 :(得分:2)

也许看看tee命令。它的作用是简单地将其输入打印到文件,但它也将其输入打印到标准输出。如下所示:

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

将创建一个内容为“Hello”的文件,并将hello作为参数传递给<some_command>