notify-send音量亮度通知命令报错及弹窗替换实现问询
问题解决:ZSH下amixer+notify-send报错与通知替换方案
一、先搞定命令报错的问题
你遇到的zsh: bad math expression错误,根源是两方面:一是amixer输出处理后残留的%符号让printf无法正确解析参数,二是ZSH对未加引号的printf格式字符串有特殊解析逻辑。
直接用下面修正后的命令就能解决:
notify-send --expire-time=50 --replace-id=123 "Volume $(printf "%.0f%%" $(amixer get Master | awk -F'[][]' '/%/ {print $2}' | cut -d% -f1 | head -n1))"
我拆解下调整点:
- 替换了原来的awk+tr组合:用
awk -F'[][]' '/%/ {print $2}'直接以[]为分隔符提取音量值(比如从[50%]里拿到50%),更简洁可靠。 - 加了
cut -d% -f1:把50%里的%彻底去掉,得到纯数字,避免printf把%当成无效参数报错。 - 加了
head -n1:如果你的amixer会输出左右声道两行结果,只取第一行的音量值,防止传递多个参数给printf造成混乱。 - 给printf的格式字符串
"%.0f%%"套了双引号:避免ZSH对格式符的意外解析干扰。
二、让通知自动替换,只显示最新一条
这部分很简单,给notify-send加--replace-id参数就行。指定一个固定的整数ID(比如我用的123),每次发送的通知都会替换掉之前同ID的通知,始终只显示最新的音量状态。
如果是亮度调整的通知,只需要把amixer的部分换成你系统获取亮度的命令,再用另一个ID(比如124)区分即可,比如:
# 假设用brightnessctl获取亮度,最大值为255 notify-send --expire-time=50 --replace-id=124 "Brightness $(printf "%.0f%%" $(brightnessctl get | awk '{print $1 * 100 / 255}'))"
进阶:封装成函数方便调用
要是觉得每次敲长命令麻烦,可以把这两个逻辑封装成函数,放到你的.zshrc里:
# 音量通知函数 notify-volume() { local vol=$(amixer get Master | awk -F'[][]' '/%/ {print $2}' | cut -d% -f1 | head -n1) notify-send --expire-time=50 --replace-id=123 "Volume $(printf "%.0f%%" "$vol")" } # 亮度通知函数 notify-brightness() { local brightness=$(brightnessctl get | awk '{print $1 * 100 / 255}') notify-send --expire-time=50 --replace-id=124 "Brightness $(printf "%.0f%%" "$brightness")" }
以后直接敲notify-volume或notify-brightness就能触发对应通知,还方便后续调整参数。
内容的提问来源于stack exchange,提问作者Eyvind Bjarti Andersen
相关产品推荐
相关产品推荐

