首页 > 解决方案 > 带有环境变量的 Go 中的 exec.Command()

问题描述

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

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

结果是:

$PATH

而不是“PATH = / bin ...”的预期值。

为什么?我怎样才能得到期望值?

标签: goexec

解决方案


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

exec包文档

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

...

要扩展环境变量,请使用包 os 的 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 检索由键命名的环境变量的值。如果变量存在于环境中,则返回值(可能为空)并且布尔值为真。否则返回值为空,布尔值为假。

推荐阅读