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

标签 bash shell pipe

我正在尝试用 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/

相关文章:

python - 将文件(使用 bash)复制为新文件并在文件中编辑变量

arrays - bash 中的关联数组用于存储所有以 X 开头的行

linux - 无法从 AWS CloudFormation 脚本更新 .bashrc 文件

c++ - 制作 : setting up a complex prerequisit list

linux - 无法在 shell 脚本中使用变量进行比较

bash - 如何将 heredoc 写入 Bash 脚本中的文件?

linux - 环境/全局变量不在 shell 脚本中展开

c - 管道 - 与多个 fork 的子进程通信

c - 如何将数据通过管道传输到在 Linux 中调用 scanf() 和 read() 的程序

python - 大对象和 `multiprocessing` 管道和 `send()`