使用环境变量转到exec.Command()

时间:2018-06-25 02:25:18

标签: go exec

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

out, err := exec.Command("echo", "$PATH").Output()

结果是:

$PATH

代替“ PATH = / bin ...”的期望值。

为什么?怎样获得期望值?

2 个答案:

答案 0 :(得分:5)

您的命令没有被shell解释,这就是为什么没有发生预期的变量替换的原因。

来自exec package documentation

  

... os / exec程序包故意不调用系统外壳   并且不会扩展任何glob模式或处理其他扩展,   管道,或通常由Shell完成的重定向。

...

  

要扩展环境变量,请使用程序包的ExpandEnv。

因此,在您的示例中要获得预期的结果:

out, err := exec.Command("echo", os.ExpandEnv("$PATH")).Output()

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

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

答案 1 :(得分:1)

您可以尝试从Go by Example: Environment Variables(而不是系统命令echo)使用os.Getenv

fmt.Println("PATH:", os.Getenv("PATH"))