我已经为此绞尽脑汁有一段时间了。
- 这个答案:抑制 mpg123 中的“欢迎”消息?仅在想要抑制所有输出时才回答这种情况
- 这个答案:https://stackoverflow.com/questions/50797724/cannot-capture-diagnostic-output-from-mpg123-while-the-program-is-running让我认为将输出重定向到文件然后读取该文件的解决方案不起作用
- 明显的事情,比如通过管道连接到 sed、awk 或 tail 来删除前几行是行不通的(例如,使用来自https://stackoverflow.com/questions/24542425/bash-how-to-remove-first-2-lines-from-output)
答案1
事实证明,管道缓冲导致 mpg123 的-C
选项出现问题。这可以通过使用--line-buffered
grep 或 sed 中的选项来解决-u
。
最后,我最终使用的标志集是:
mpg123 -Z -C --title */* 2>&1 | grep --line-buffered -Ev "High Performance|written and copyright by|without any warranty but with best wishes|Terminal control enabled|MPEG 1.0|Decoding of" | sed -uE 's/Playing MPEG stream [0-9]+ of [0-9]+: //' | sed -uE "s/Directory: //" | sed -uE "s/\.\.\.//" | sed -uE '/^\s*$/d'
我正在一步一步地浏览这些选项。其中一些回答了更广泛的问题,即拥有方便的 mpg123 设置。
-Z
是永恒的随机洗牌-C
允许控制命令--title
将终端的标题更改为当前歌曲的标题*/*
在当前子目录中查找文件。如果文件位于给定目录中,则“*”就足够了。2>&1
从标准错误(mpg123 打印到的)重定向到标准输出,可以使用管道进行操作--line-buffered
在 grep 和-u
sed 上的标志避免缓冲,这就是给我带来问题的原因。- 其他标志只是正则表达式切换,并不是问题的核心。
然后我为该命令起了别名以方便使用。
alias pmr="clear; mpg123 -Z -C --title */* 2>&1 | grep --line-buffered -Ev 'High Performance|written and copyright by|without any warranty but with best wishes|Terminal control enabled|MPEG 1.0|Decoding of' | sed -uE 's/Playing MPEG stream [0-9]+ of [0-9]+: //' | sed -uE 's/Directory: //' | sed -uE 's/\.\.\.//' | sed -uE '/^\s*$/d'" ## pmr := play music recursively
tail 有-f
一个标志来避免缓冲,但它一直给我带来问题。