我想在 Go 中运行以下代码:
out, err := exec.Command("echo", "$PATH").Output()
结果是:
$PATH
而不是“PATH=/bin...”的预期值。
为什么?我怎样才能得到期望值?
shell 没有解释您的命令,这就是预期的变量替换没有发生的原因。
来自exec包文档 https://golang.org/pkg/os/exec/:
...os/exec 包故意不调用系统 shell
并且不扩展任何全局模式或处理其他扩展,
管道,或通常由 shell 完成的重定向。
...
要扩展环境变量,请使用包 os 的 ExpandEnv。
因此,为了在您的示例中达到预期的结果:
out, err := exec.Command("echo", os.ExpandEnv("$PATH")).Output()
值得回顾一下用于获取环境变量并使用最适合您的特定用例的函数集:
-
func ExpandEnv(s string) string https://golang.org/pkg/os/#ExpandEnv- ExpandEnv 根据当前环境变量的值替换字符串中的${var} 或$var。对未定义变量的引用将替换为空字符串。
-
func Getenv(key string) string https://golang.org/pkg/os/#Getenv- Getenv 检索由键命名的环境变量的值。它返回值,如果变量不存在,则该值将为空。要区分空值和未设置的值,请使用 LookupEnv。
-
func LookupEnv(key string) (string, bool) https://golang.org/pkg/os/#LookupEnv- LookupEnv 检索由键命名的环境变量的值。如果环境中存在变量,则返回值(可能为空)并且布尔值为 true。否则返回值将为空并且布尔值将为 false。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)