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



可能的重复:
OSX/Linux:管道分为两个过程?

是否有一种方法可以将输出从一个命令输入其他两个命令的输入,同时运行它们?

类似的东西:

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

我要这样做的原因是我有一个程序,该程序从USB SDR设备接收FM无线电信号,并将音频作为RAW PCM数据输出(例如.Wav文件,但没有标题。)信号不是音乐,而是POCSAG PAGER数据,我需要将其输送到解码器程序以恢复Pager文本。但是,我也想听信号,所以我知道是否有任何数据来了。(否则,我无法分辨解码器是否损坏或只是没有广播数据。)因此,除了将数据输送到Pager解码器中,我还需要将相同的数据输送到play命令。

目前,我只知道如何做 - 要么将其管道到解码器并默默地阅读数据,要么将其送到play并听到它而不看到任何解码文本。

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

我不能使用 tee,因为它只会将重复的数据写入文件,但是我需要实时处理数据。

如果您同时使用teemkfifo

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

最近的bash存在 >(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

也许请查看tee命令。它的作用只是将其输入打印到文件中,但它还将其输入打印到标准输出。所以类似:

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

将创建一个带有内容的文件。也要让"你好"(流过管道)最终以<some_command>的stdin。

相关内容

  • 没有找到相关文章

最新更新