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