具有非常相似的命令调用

cmdDirect := exec.Command("theExecutable")
cmdShell := exec.Command(os.GetEnv("SHELL"),  "-c",  "theExecutable")

两者具有相同的环境设置

envWithPath := append(os.Environ(), fmt.Sprintf("PATH=/real/existing/path/to/theExecutable/holder:%s", os.GetEnv("PATH")))

cmdDirect.Env = envWithPath
cmdShell.Env = envWithPath

不过,虽然cmdShell的运行情况和预期一样好,但cmdDirect失败了

exec: "theExecutable": executable file not found in $PATH

对于所提到的完全相同的环境设置,调用也成功

cmdWhich := exec.Command("which", "theExecutable")

适当地返回/real/existing/path/to/theExecutable/holder/theExecutable%

那么,造成这种差异的原因可能是什么呢?

另外,这两种方法肯定都有非常相同的$PATH设置.例如.

exec.Command("env")
exec.Command(os.GetEnv("SHELL"),  "-c",  "env")

两个输出都是相同的PATH=....序列吗

THX

推荐答案

exec.Command使用exec.LookPath查找可执行文件的路径,该路径使用您的路径,而不是cmd上设置的路径.

如果您希望对特定的可执行文件进行更可靠的查找(或者像您所拥有的那样产生一个子shell ),我建议将Cmd.Path设置为可执行文件的路径.

Go相关问答推荐

语法-for循环中的initit陈述是否允许分配?

Go:嵌入类型不能是类型参数""

调用API时使用nginx作为反向代理时从nginx获取502坏网关

获取作为类型参数传递给方法接收方中的类型参数的切片的基础类型

如何使用gopher-lua定义一个Lua函数,该函数有一个预定义的表作为param,Lua脚本可以在其中访问该函数中的表?

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

如何为循环扫描的bufio scanner 设置超时?

从 ApiGateway 中的 lambda Go 返回 Json

启动套接字服务器会干扰 gRPC/http 客户端服务器通信 Golang

Caddy服务器try 打开端口80而不是8090.

以编程方式取消 pyspark dataproc 批处理作业(job)

Opensearch 错误 ping 弹性服务器:由未知权威签署的 x509 证书

如何使用 sync.WaitGroup 来执行所有的 goroutine?

golang 中的可变参数函数

如何将 npm 安装进度条通过管道传输到终端?

go-libp2p - 从流中接收字节

如何在 helm 中将字符串连接到 .AsConfig 的结果?

Go 中 SDL Surface 的 OpenGL 纹理

如何从 docker-compose 命令运行 2 个不同的命令:

Golang 中的无实体函数