Go中的exec.Command()与环境变量

Vla*_*mir 3 exec go

我想在Go中运行以下代码:

out, err := exec.Command("echo", "$PATH").Output()
Run Code Online (Sandbox Code Playgroud)

结果是:

$PATH
Run Code Online (Sandbox Code Playgroud)

而不是"PATH =/bin ..."的预期值.

为什么?我怎样才能获得预期的价值?

chu*_*ckx 5

shell不会解释您的命令,这就是未发生预期变量替换的原因.

从exec包文档:

... os/exec包故意不会调用系统shell,也不会扩展任何glob模式或处理通常由shell完成的其他扩展,管道或重定向.

...

要扩展环境变量,请使用package os的ExpandEnv.

因此,要在您的示例中实现所需的结果:

out, err := exec.Command("echo", os.ExpandEnv("$PATH")).Output()
Run Code Online (Sandbox Code Playgroud)

值得回顾一下获取环境变量的函数集,并使用最适合您特定用例的函数:

  • func ExpandEnv(s string) string - ExpandEnv根据当前环境变量的值替换字符串中的$ {var}或$ var.对未定义变量的引用将替换为空字符串.
  • func Getenv(key string) string - Getenv检索由键命名的环境变量的值.它返回值,如果变量不存在,该值将为空.要区分空值和未设置值,请使用LookupEnv.
  • func LookupEnv(key string) (string, bool) - LookupEnv检索由键命名的环境变量的值.如果变量存在于环境中,则返回值(可能为空)并且布尔值为true.否则返回的值将为空,布尔值将为false.


Von*_*onC 1

从Go 示例:环境变量 中,您可以尝试(而不是系统命令echo)使用os.Getenv:

fmt.Println("PATH:", os.Getenv("PATH"))
Run Code Online (Sandbox Code Playgroud)