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

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 "迁移操作完成!"
关键部分解释
  1. 参数配置

    • 你需要先通过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。
  2. 前置检查
    脚本开头先确认pacmd工具存在,并且目标sink是有效的,避免执行无效操作报错。

  3. 流信息解析与迁移
    用awk处理pacmd list-sink-inputs的输出,因为每个sink-input的信息是独立的块:

    • 匹配Sink Input #行时,提取当前输入的ID;
    • 匹配module-stream-restore.id行时,标记是否为要保留的流;
    • 当块结束(空行)或输出末尾时,对非目标流执行pacmd move-sink-input命令完成迁移。

内容的提问来源于stack exchange,提问作者TurboGraphxBeige

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:23:03