2012-10-28 42 views
2

我想在bash中写简单的通知应用程序。我想从mplayer读取输出,解析它并通过notify-send来显示。写mplayer的输出到fifo并阅读它

我可以使用此获得所需的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不起作用。

回答

3

你可以做无缓冲的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 
+0

感谢您的回答! “ - 线缓冲”为我做了诡计。 :-) –

5

我怀疑你可能正在体验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)

+0

一个stdbuf就够了。谢谢! –

+0

使用'stdbuf -o 0'对于sed的grep或'-u'选项是''-line-buffered'选项的矫枉过正! –

0

我在从模式启动的mplayer,采用先进先出文件。

mkfifo /tmp/mpfifo 

mplayer -slave -input file=/tmp/mpfifo video.mp4 

我能够从另一个终端控制视频播放器。

echo "pause" >> /tmp/mpfifo 
echo "volume 50" > /tmp/mpfifo 

我想获得价值(例如播放视频的当前位置)。所以我尝试过:

echo "get_time_pos" > /tmp/mpfifo 

但是没有返回任何值。 我搜索了几个小时,但没有成功。 然后我认为mplayer的输出重定向到文件:

mplayer -slave -input file=/tmp/mpfifo video.mp4 > /tmp/mpout.txt 

之后,当像下面的命令执行:

echo "get_time_pos" > /tmp/mpfifo 
echo "get_property length" > /tmp/mpfifo 

在/tmp/mpout.txt输出像:

....... 
....... 
ANS_TIME_POSITION=113.6 
ANS_length=2534.602031 

如果每个命令的结果将返回到命令行将是非常好的。尽管它可能需要一些工作,但输出文件可以被解析。