我正在尝试用 bash 编写简单的通知应用程序。我想从 mplayer 读取输出,解析它并通过通知发送显示。
我可以使用这个从 mplayer 获取所需的信息:
mplayer <url> | grep ICY
然后用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
程序一直在等待来自 $fifo 的输入。当这个脚本正在运行时,我尝试在其他终端中进行以下操作:
运行
echo "Test" > .rp/fifo
运行脚本的终端显示“测试”
运行
echo "ICY" | grep ICY > .rp/fifo
也有效。
运行
mplayer <url> | grep ICY > .rp/fifo
而且它不有效。
就是我上面说的mplayer的组合| grep 工作正常。 grep > $fifo 工作正常。我不明白为什么 mplayer | grep > $fifo 不起作用。
最佳答案
我怀疑您可能正在体验 C 库的流完全缓冲模式。你没有说你正在运行 GNU 用户空间,但如果你是,你可以查看 stdbuf(1)
来修改缓冲机制。
您可以先尝试将 grep
作为 stdbuf(1)
的子项运行,如下所示:
mplayer <url> | stdbuf -o L grep ICY > .rp/fifo
如果这不起作用,moar 是更好的选择!
stdbuf -o 0 mplayer <url> | stdbuf -o L grep ICY > .rp/fifo
如果还是不行,可能是 mplayer
没有写入标准输出,而是直接写入了 /dev/tty
。在这种情况下,您需要阅读 expect(1)
。
关于bash - 将 mplayer 的输出写入 fifo 并读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13111633/