Warning
所有需要使用到环境变量的地方,都需要注意当前程序是从哪里加载环境变量的
- 例如,在终端中执行命令,会集成当前shell窗口下的环境变量,但是在其他地方,例如打包后的程序中可能就无法获取这个环境变量
你遇到的 exit status 127 错误,通常表示 shell 无法找到命令(即 jbig2)。你在 Go 程序中执行失败,但在终端手动执行同样的命令却能正常运行,这通常有以下几种原因:
可能原因分析
- 环境变量 PATH 不同
Go 程序通过exec.Command("sh", "-c", ...)启动的 shell,继承的是当前进程的环境变量。如果你的jbig2命令没有在默认的 PATH 路径下,Go 程序就找不到它,而你在终端运行时,终端的 PATH 可能更丰富(比如加载了.zshrc、.bash_profile等)。
解决方法
方法一:在 Go 代码中指定完整路径
如果你知道 jbig2 的绝对路径,比如 /usr/local/bin/jbig2,可以直接写死:
cmdStr := fmt.Sprintf("'/usr/local/bin/jbig2' -a -p -v '%s' > '%s'", inputFile, outputFile)方法二:在 Go 代码中设置 PATH
在 exec.Command 之后,设置 cmd.Env,让 PATH 包含 jbig2 所在目录:
cmd := exec.Command("sh", "-c", cmdStr)
cmd.Env = append(os.Environ(), "PATH=/usr/local/bin:/usr/bin:/bin") // 根据你的实际情况补全方法三:用 exec.LookPath 查找 jbig2 路径
jbig2Path, err := exec.LookPath("jbig2")
if err != nil {
logger.Printf("找不到jbig2命令: %v", err)
return err
}
cmdStr := fmt.Sprintf("'%s' -a -p -v '%s' > '%s'", jbig2Path, inputFile, outputFile)
cmd := exec.Command("sh", "-c", cmdStr)