如何编写脚本实现主音量(Master sound level)的获取、设置与恢复
如何编写脚本实现主音量(Master sound level)的获取、设置与恢复
嘿,这个需求我之前也碰到过,用shell脚本搭配amixer就能完美解决,我给你梳理一个清晰的实现方案,从获取原始音量、调整音量、执行任务到恢复音量一步到位:
1. 先获取并保存当前主音量
首先我们需要把当前的主音量值提取出来保存到变量里,方便后续恢复。amixer get Master会输出当前音量的详细信息,我们可以用文本处理工具提取出具体的百分比数值:
# 提取当前主音量并保存(去掉百分号存为数字) original_volume=$(amixer get Master | grep -oP '\d+%' | head -n1 | tr -d '%')
简单解释下这条命令:
amixer get Master:输出主音量的状态信息grep -oP '\d+%':匹配并提取所有带百分号的数字head -n1:取第一个结果(对应主声道的音量值,避免左右声道分开的情况)tr -d '%':去掉百分号,把数值存成纯数字变量
2. 调整音量(支持渐变效果)
如果需要平滑渐变到目标音量(比如你说的背景音淡出),可以用amixer的fade参数,指定渐变时长(单位是秒)。比如5秒内渐变到20%:
# 5秒内将主音量渐变到20%,你可以自行修改目标音量和时长 amixer sset Master 20% fade 5
如果不需要渐变,直接设置音量的话,去掉fade 5即可:
amixer set Master 20%
3. 执行你的自定义程序
这一步就放你需要运行的核心任务就行,比如启动某个程序、执行脚本等,这里用sleep模拟任务运行时长:
echo "正在执行自定义任务..." # 替换成你实际要运行的命令,比如: # /home/yourname/scripts/your-procedure.sh sleep 10 # 模拟任务运行10秒
4. 恢复原始音量
任务完成后,直接调用保存的原始音量值恢复即可,同样可以加渐变效果让恢复更平滑:
# 3秒内恢复到原始音量 amixer sset Master "${original_volume}%" fade 3
完整脚本示例
把上面的步骤整合起来,就是一个可以直接用的脚本了,记得给脚本加执行权限(chmod +x volume-control.sh):
#!/bin/bash # 关闭amixer的冗余输出,让脚本运行更清爽 exec 3>&1 4>&2 trap 'exec 2>&4 1>&3' 0 1 2 3 exec 1>/dev/null 2>&1 # 1. 获取并保存当前主音量 original_volume=$(amixer get Master | grep -oP '\d+%' | head -n1 | tr -d '%') echo "已保存当前音量: ${original_volume}%" >&3 # 2. 渐变音量到目标值(示例:20%,5秒完成) echo "正在渐变音量到20%..." >&3 amixer sset Master 20% fade 5 # 3. 执行自定义任务 echo "开始执行自定义程序..." >&3 # 替换成你的实际任务命令 sleep 10 # 4. 恢复原始音量 echo "正在恢复原始音量..." >&3 amixer sset Master "${original_volume}%" fade 3 echo "音量恢复完成!" >&3
一些注意事项
- 如果你系统的主音频通道不是
Master,可以用amixer scontrols命令查看所有可用的混音器控件,替换成对应的名称即可。 - 脚本里的
exec 1>/dev/null 2>&1是把amixer的输出重定向到空设备,避免运行时输出一堆无关信息,同时用文件描述符把我们自己的提示信息输出到终端。 - 少数系统可能需要
sudo权限才能调整音量,但大部分普通用户账户直接运行就行。
备注:内容来源于stack exchange,提问作者Pansmanser




