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

Go 1.23.0中执行amixer命令提示‘Invalid card number’的问题排查求助

Go 1.23.0中执行amixer命令提示‘Invalid card number’的问题排查求助

各位好,我最近在Go 1.23.0环境里尝试调用amixer命令设置音频音量,遇到了一个奇怪的问题:直接在Debian终端执行amixer -c 3 set PCM 50%完全正常,用alsamixer -c 3也能验证音量确实改了,但把这条命令放到Go代码里执行就会报错说“Invalid card number '3'”,试了好几种参数写法都没解决,想请大家帮忙看看哪里出问题了。

先贴一下我的最小复现代码:

package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
)

func main() {
	setVolumeCommand := exec.Command("/usr/bin/amixer", "-c", "3", "set", "PCM", "50%")
	setVolumeCommand.Stdout = os.Stdout
	setVolumeCommand.Stderr = os.Stderr
	setVolumeError := setVolumeCommand.Run()
	if setVolumeError != nil {
		log.Fatal(setVolumeError)
	}
}

运行这段代码后,输出是:

Resetting Mbed Audio ... ok
Invalid card number '3'.
2025/06/10 16:03:46 exit status 1

我还试了好几种exec.Command的参数组合,结果都报类似的错误:

  • 写成exec.Command("/usr/bin/amixer", "-c 3", "set PCM 50%"),错误是Invalid card number ' 3'.
  • 写成exec.Command("/usr/bin/amixer", "-c 3 set PCM 50%"),错误是Invalid card number ' 3 set PCM 50%'
  • 写成exec.Command("/usr/bin/amixer", "-c 3", "set PCM", "50%"),错误还是Invalid card number ' 3'.

我甚至在初始化命令后加了一行fmt.Printf("setVolumeCommand: %v\n", setVolumeCommand),输出显示命令是正确的:setVolumeCommand: /usr/bin/amixer -c 3 set PCM 50%,看起来和终端里跑的完全一样。

后来我还尝试把Bash里所有的环境变量(用env命令导出的)都加到Go的命令里,比如:

setVolumeCommand := exec.Command("/usr/bin/amixer", "-c", "3", "set", "PCM", "50%")
setVolumeCommand.Env = os.Environ()
// 这里还手动加了一些环境变量比如SHELL和HOME
setVolumeCommand.Env = append(setVolumeCommand.Env, "SHELL=/bin/bash HOME=/home/pi ...")
setVolumeCommand.Stdout = os.Stdout
// ...后续代码不变

但结果还是一样的错误,真的搞不懂哪里出问题了,有没有大佬能指点一下?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:12:57