我正在尝试在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输入.我尝试在其他终端中关注,而此脚本正在运行:
跑
echo "Test" > .rp/fifo
Run Code Online (Sandbox Code Playgroud)
带有运行脚本的终端显示"测试"
跑
echo "ICY" | grep ICY > .rp/fifo
Run Code Online (Sandbox Code Playgroud)
也有效.
跑
mplayer <url> | grep ICY > .rp/fifo
Run Code Online (Sandbox Code Playgroud)
它不起作用.
我上面说过,mplayer的组合| grep工作得很好.grep> $ fifo工作正常.我不明白为什么mplayer | grep> $ fifo不起作用.
我怀疑你可能正在体验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).
| 归档时间: |
|
| 查看次数: |
5937 次 |
| 最近记录: |