35

可能重复:
osx/linux:管道进入两个进程?

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

像这样的东西:

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

我想这样做的原因是我有一个程序,它从 USB SDR 设备接收 FM 无线电信号,并将音频输出为原始 PCM 数据(如 .wav 文件,但没有标题。)因为信号不是音乐,但 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>'s STDIN。

于 2012-10-28T09:46:34.000 回答