shell exec.Command + PATH的可执行文件解析

yebdmbv4  于 2023-10-23  发布在  Shell
关注(0)|答案(1)|浏览(135)

有非常相似的命令调用

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
那么,造成这种差异的原因是什么呢?
P.S.以及这两种方法肯定有非常相同的$PATH设置。例如

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

都输出相同的PATH=....序列
Thx

iugsix8n

iugsix8n1#

exec.Command查找exec.LookPath的可执行文件的路径,它使用您的PATH,而不是cmd上设置的PATH。
如果你想更可靠地查找特定的可执行文件(或者生成一个子shell),我建议你将Cmd.Path设置为可执行文件的路径。

相关问题