gpt4 book ai didi

bash - 将 mplayer 的输出写入 fifo 并读取

转载 作者:行者123 更新时间:2023-11-29 09:18:29 24 4
gpt4 key购买 nike

我正在尝试用 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 的输入。当这个脚本正在运行时,我尝试在其他终端中进行以下操作:

  1. 运行

    echo "Test" > .rp/fifo

    运行脚本的终端显示“测试”

  2. 运行

    echo "ICY" | grep ICY > .rp/fifo

    也有效。

  3. 运行

    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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com