我想在Go中运行以下代码:
out, err := exec.Command("echo", "$PATH").Output()
结果是:
$PATH
代替“ PATH = / bin ...”的期望值。
为什么?怎样获得期望值?
答案 0 :(得分:5)
您的命令没有被shell解释,这就是为什么没有发生预期的变量替换的原因。
... 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"))