Linux Bash脚本解析命令结果实现Pulseaudio输入输出路由控制
我来帮你搞定这个Pulseaudio流路由的Bash脚本,完全贴合你的需求——把除了指定sink-input之外的所有输入都转到目标sink上。下面是完整实现和详细解释:
实现思路
咱们的核心逻辑很清晰:
- 先拿到所有当前活跃的sink-input ID
- 逐个检查每个输入流的
module-stream-restore.id标识 - 把非目标标识的流全部迁移到指定sink
完整脚本
直接复制下面的脚本,替换掉开头的配置参数就能用:
#!/bin/bash # 配置参数:替换成你需要保留的流的module-stream-restore.id TARGET_STREAM_ID="your-target-stream-id-here" # 配置参数:替换成你要迁移到的sink的名称或ID(比如alsa_output.pci-0000_00_1f.3.analog-stereo) TARGET_SINK="your-target-sink-name-or-id" # 检查pacmd是否可用 if ! command -v pacmd &> /dev/null; then echo "错误:pacmd命令未找到,请确保已安装Pulseaudio" exit 1 fi # 检查目标sink是否存在 if ! pacmd list-sinks | grep -q "name: <$TARGET_SINK>"; then echo "错误:目标sink $TARGET_SINK 不存在" exit 1 fi # 获取所有sink-input的ID,并逐个处理 pacmd list-sink-inputs | awk -v target_id="$TARGET_STREAM_ID" -v target_sink="$TARGET_SINK" ' /Sink Input #/ { # 记录当前sink-input的ID,去掉末尾的冒号 current_id = substr($3, 1, length($3)-1) keep_stream = 0 } /module-stream-restore.id/ { # 判断当前流是否是需要保留的目标流 if ($2 == "\"" target_id "\"") { keep_stream = 1 } } # 遇到空行时,代表当前sink-input的信息块结束,执行迁移判断 /^$/ { if (current_id != "" && keep_stream == 0) { print "正在迁移sink-input #" current_id " 到sink " target_sink system("pacmd move-sink-input " current_id " " target_sink) } current_id = "" keep_stream = 0 } # 处理最后一个没有结尾空行的sink-input块 END { if (current_id != "" && keep_stream == 0) { print "正在迁移sink-input #" current_id " 到sink " target_sink system("pacmd move-sink-input " current_id " " target_sink) } } ' echo "迁移操作完成!"
关键部分解释
参数配置
- 你需要先通过
pacmd list-sink-inputs命令找到要保留的流的module-stream-restore.id(比如它可能是"spotify"或者"firefox"),替换TARGET_STREAM_ID的值。 - 通过
pacmd list-sinks获取目标sink的名称(比如alsa_output.pci-0000_00_1f.3.analog-stereo),替换TARGET_SINK。
- 你需要先通过
前置检查
脚本开头先确认pacmd工具存在,并且目标sink是有效的,避免执行无效操作报错。流信息解析与迁移
用awk处理pacmd list-sink-inputs的输出,因为每个sink-input的信息是独立的块:- 匹配
Sink Input #行时,提取当前输入的ID; - 匹配
module-stream-restore.id行时,标记是否为要保留的流; - 当块结束(空行)或输出末尾时,对非目标流执行
pacmd move-sink-input命令完成迁移。
- 匹配
内容的提问来源于stack exchange,提问作者TurboGraphxBeige
相关产品推荐
相关产品推荐

