Warning

所有需要使用到环境变量的地方,都需要注意当前程序是从哪里加载环境变量的

  • 例如,在终端中执行命令,会集成当前shell窗口下的环境变量,但是在其他地方,例如打包后的程序中可能就无法获取这个环境变量

你遇到的 exit status 127 错误,通常表示 shell 无法找到命令(即 jbig2)。你在 Go 程序中执行失败,但在终端手动执行同样的命令却能正常运行,这通常有以下几种原因:

可能原因分析

  1. 环境变量 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)