有非常相似的命令调用
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
1条答案
按热度按时间iugsix8n1#
exec.Command
查找exec.LookPath
的可执行文件的路径,它使用您的PATH,而不是cmd上设置的PATH。如果你想更可靠地查找特定的可执行文件(或者生成一个子shell),我建议你将
Cmd.Path
设置为可执行文件的路径。