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
相关产品推荐
相关产品推荐

