我试图使用exec库为go(golang)执行shell命令。但是,每当我尝试使用我用go install
安装的二进制文件执行它时,我就无法工作。
我尝试在终端上运行我的二进制文件并且它们正常工作。我检查了我的$ PATH确实有我的go路径的bin文件,所以这在终端很好。但后来我尝试通过执行以下操作在os exec中执行相同的检查:
echo := exec.Command("echo", "$PATH")
b, err := echo.Output()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
但令人惊讶的是,它以一种奇怪的方式工作,它回避了文字字符串$PATH
!难以置信!有什么我做错了吗?我甚至无法看到$ PATH os exec实际上正在运行...也不能像以下命令一样在go exec中运行我的二进制文件:
exec.Command("myCommand").Run()
任何人都有任何建议,为什么会这样?
此问题的问题是无法打印 $PATH
。什么不起作用是我无法运行$GOPATH/bin
下安装的命令,即使它位于$PATH
下
答案 0 :(得分:3)
环境变量扩展是一个shell功能,而不是程序功能。
您必须使用os.Getenv("PATH")
。
echo := exec.Command("echo", os.Getenv("PATH"))
或者您可以使用 os.ExpandEnv
:
echo := exec.Command(strings.Fields(os.ExpandEnv("echo $PATH"))...)
击> <击> 撞击>
答案 1 :(得分:2)
您尝试运行shell命令echo $PATH
而不使用shell来执行变量扩展。正在运行的echo
是一个二进制文件,可能是/ bin / echo,它正在传递字符串$PATH
。 $ PATH没有扩展,因为它是shell的一个功能,它没有涉及,因此不会发生扩展。要获得预期,您需要使用shell来运行命令,例如exec.Command("sh", "-c", "echo $PATH")
答案 2 :(得分:1)
所以我弄明白为什么我无法运行我的命令。这是我的原始代码:
cmd := exec.Command("my command")
b, err := cmd.Output()
//fmt.Println("string(b):", string(b)) //<--inspecting stdout before throwing an error revealed that it *was* doing my command!
if err != nil {
log.Fatal(err)
}
fmt.Println("string(b):", string(b)) //<-- wouldn't run so I would never see its out put.
它正在运行该命令,但因为我所做的命令返回了一个错误,所以exec并不知道它是否正在退出,因为它没有找到命令或者因为我的命令是错误的。因此,如果该命令抛出错误但也写入stdout,则可以在.Output()'s
返回值上获得“有效”信息。
我试图打印$PATH
的唯一原因是看看我的命令是否甚至在$ PATH中为go的exec env。但OneOfOne的回答明确指出,可以通过以下方式找到:
echo := exec.Command("echo", os.Getenv("PATH"))