将mplayer的输出写入fifo并读取它

Tom*_*ich 3 bash shell pipe

我正在尝试在bash中编写简单的通知应用程序.我想从mplayer读取输出,解析它并通过notify-send显示.

我可以使用这个从mplayer获得所需的信息:

mplayer <url> | grep ICY
Run Code Online (Sandbox Code Playgroud)

然后使用sed解析.

我创建命名管道,告诉mplayer写它然后我正在读它.不幸的是,它不起作用.这是我的脚本:

$fifo=~/.rp/fifo
mkfifo $fifo

mplayer <url> 2>/dev/null | grep ICY 1> $fifo &

while read line < $fifo; do
    echo $line
done

wait
Run Code Online (Sandbox Code Playgroud)

程序一直在等待从$ fifo输入.我尝试在其他终端中关注,而此脚本正在运行:

  1. echo "Test" > .rp/fifo
    
    Run Code Online (Sandbox Code Playgroud)

    带有运行脚本的终端显示"测试"

  2. echo "ICY" | grep ICY > .rp/fifo
    
    Run Code Online (Sandbox Code Playgroud)

    也有效.

  3. mplayer <url> | grep ICY > .rp/fifo
    
    Run Code Online (Sandbox Code Playgroud)

    不起作用.

我上面说过,mplayer的组合| grep工作得很好.grep> $ fifo工作正常.我不明白为什么mplayer | grep> $ fifo不起作用.

Ber*_*sek 5

我怀疑你可能正在体验C库的流的完全缓冲模式.你没有说你正在运行GNU用户空间,但如果你是,你可以考虑stdbuf(1)修改缓冲机制.

您可能会尝试首先grep像孩子stdbuf(1)一样运行,如下所示:

mplayer <url> | stdbuf -o L grep ICY > .rp/fifo
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,那么moar就是bettar!

stdbuf -o 0 mplayer <url> | stdbuf -o L grep ICY > .rp/fifo
Run Code Online (Sandbox Code Playgroud)

如果这仍然不起作用,那么可能mplayer不是写入stdout,而是直接写入/dev/tty.在这种情况下,您需要阅读expect(1).