Go中exec.Command调用macOS log命令返回exit status 64求助
解决macOS下Go调用
log命令报错exit status 64的问题 问题原因分析
exit status 64对应BSD退出码中的EX_USAGE,通常表示命令参数使用错误或命令无法正确找到/执行。你在终端直接运行log help正常,说明问题出在Go程序调用命令的方式或运行环境上,常见原因有两个:
- Go程序运行时的环境变量
PATH不包含log命令的所在目录(默认/usr/bin),导致exec.Command找不到正确的二进制文件; log命令的输出可能部分/全部写入标准错误流(stderr),而Output()方法仅捕获标准输出(stdout),无法看到具体错误细节。
解决方法
1. 使用log命令的完整路径调用
在终端执行which log,得到完整路径(通常是/usr/bin/log),修改代码直接使用完整路径:
func main() { out, err := exec.Command("/usr/bin/log", "help").Output() if err != nil { // 解析ExitError获取stderr内容,排查具体错误 if exitErr, ok := err.(*exec.ExitError); ok { log.Printf("error: %v, stderr: %s", err, string(exitErr.Stderr)) } else { log.Printf("error: %v", err) } } fmt.Println(string(out)) }
2. 捕获所有输出(stdout+stderr)
使用CombinedOutput()方法替代Output(),同时获取标准输出和错误输出,方便排查具体问题:
func main() { out, err := exec.Command("log", "help").CombinedOutput() if err != nil { log.Printf("error: %v", err) } fmt.Println(string(out)) }
3. 显式设置环境变量
如果是PATH缺失导致的问题,可以在命令中显式设置环境变量,确保包含/usr/bin:
func main() { cmd := exec.Command("log", "help") // 保留当前环境变量并补充/usr/bin路径 cmd.Env = append(os.Environ(), "PATH=/usr/bin:$PATH") out, err := cmd.Output() if err != nil { if exitErr, ok := err.(*exec.ExitError); ok { log.Printf("error: %v, stderr: %s", err, string(exitErr.Stderr)) } else { log.Printf("error: %v", err) } } fmt.Println(string(out)) }
验证方法
先在终端执行/usr/bin/log help确认命令本身正常,再运行修改后的Go代码,一般就能正常输出log help的内容。
内容的提问来源于stack exchange,提问作者thinkerer
相关产品推荐
相关产品推荐

