You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:28:24