繁体   English   中英

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

[英]Does os.exec from go (golang) not execute commands in $PATH?

我正在尝试使用exec库(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 无法正常工作的是,即使在$PATH下,我也无法运行在$GOPATH/bin下安装的命令

环境变量扩展是Shell功能,而不是程序功能。

您将必须使用os.Getenv("PATH")

echo := exec.Command("echo", os.Getenv("PATH"))

或者您可以使用 os.ExpandEnv

 
 
 
  
  echo := exec.Command(strings.Fields(os.ExpandEnv("echo $PATH"))...)
 
  

您正在尝试运行shell命令,在不使用shell进行变量扩展的情况echo $PATH 正在运行的echo是一个二进制文件,可能是/ bin / echo,并且正在传递字符串$PATH $ PATH不会扩展,因为那是外壳程序的功能,并且不涉及,因此不会发生扩展。 要获得您期望的结果,您需要使用外壳程序来运行命令,例如exec.Command("sh", "-c", "echo $PATH")

所以我弄清楚了为什么我无法运行命令。 这是我的原始代码:

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的唯一原因是查看go的exec env中的命令是否甚至在$ PATH中。 但是如果OneOfOne的答案明确指出,可以通过以下方式找到它:

echo := exec.Command("echo", os.Getenv("PATH"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM