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

Mal*_*ous 24 bash pipe tee

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

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

像这样的东西:

$ echo 'test' |(cat) |(cat)
test
test
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Tim*_*een 30

如果你同时使用tee和它应该没问题mkfifo.

mkfifo pipe
cat pipe | (command 1) &
echo 'test' | tee pipe | (command 2)
Run Code Online (Sandbox Code Playgroud)

  • 这对于在备份时节省 IO 非常有用。在写入之前,可以通过“pv”和“sha512sum”对“tar”输出进行管道传输,从而避免对磁盘进行两次甚至三次读取/写入。 (2认同)
  • 顺便说一句,因为这会让人很困惑,如果你想在某个命令上失败,你必须写`{somecommand || 的ErrorHandler; } | 三通管| command2`,甚至`{somecommand || errorhandlerforcommand1; } | 三通管| command2 || errorhandlerforcommand2`,作为`somecommand || errorhandler | 三通管| command2`和`somecommand | 三通管| command2 || errorhandler`没有按照人们的预期处理`somecommand`的错误! (2认同)

F. *_*uri 11

有一种方法可以通过未命名的管道(在linux下测试)来做到这一点:

 (( echo "hello" |
         tee /dev/fd/5 |
             sed 's/^/1st occure: /' >/dev/fd/4
    ) 5>&1 |
    sed 's/^/2nd command: /'
 ) 4>&1
Run Code Online (Sandbox Code Playgroud)

给:

2nd command: hello
1st occure: hello
Run Code Online (Sandbox Code Playgroud)

这个示例将允许您下载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
Run Code Online (Sandbox Code Playgroud)


izo*_*ica 5

也许看看tee命令。它所做的只是将其输入打印到文件中,但它也将其输入打印到标准输出中。所以像:

echo "Hello" | tee try.txt | <some_command>
Run Code Online (Sandbox Code Playgroud)

将创建一个内容为“Hello”的文件,并让“Hello”(流经管道)最终成为<some_command>的标准输入。

  • *我不能使用 tee,因为它只将重复的数据写入文件,但我需要实时处理数据。* (2认同)
  • 但您可以使用 tee 将输出重定向到管道。它不一定是一个文件。 (2认同)
  • @izomorphius:啊,是的,但我忘记了管道,而您的回答很方便地忽略了这一点:-P (2认同)