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

    带有运行脚本的终端显示“Test”
  • 运行
    echo "ICY" | grep ICY > .rp/fifo
    

    也有效。
  • 运行
    mplayer <url> | grep ICY > .rp/fifo
    

    工作。

  • 就是我上面说的mplayer的组合| grep 工作正常。 grep > $fifo 工作正常。我不明白为什么 mplayer | grep > $fifo 不起作用。

    最佳答案

    您可以使用以下命令执行无缓冲 grep:

    $ mplayer ...  2>&1 | grep --line-buffered "ICY"
    

    或更好:
    $ mplayer ...  2>&1 | sed -une 's/^.*ICY[^:]*: //p'
    

    甚至,为什么不呢(sed 非常适合 grep 和格式化),
    这将 grep ICY 行,甚至拆分包含 - 的行,其中第一个字段的长度为 30 个字符,由 : 与第二个字段分隔:
    $ mplayer ...  2>&1 |
        sed -une "
            /ICY/{
                s/^.*ICY[^:]*:.*'\([^']*\)';/\1/;
                s/^\(.*\) - /\1                              - /;
                s/^\(.\{30\}\) *- /\1: /;
                p;
        }"
    

    可以给出类似的东西:
    Artist name                  : Song title
    Other artist                 : Other song
    Unsplited line
    Artist                       : Title
    

    关于bash - 将mplayer的输出写入fifo并读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13111633/

    10-10 17:43