来自go(golang)的os.exec不执行$ PATH中的命令吗?

时间:2014-08-07 18:54:20

标签: macos go

我试图使用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

3 个答案:

答案 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"))