我正处于尝试执行 shell 命令的情况,但它的参数被正确解释为环境变量。例如,当我在终端中输入以下内容时ls $GOPATHBash 解释并扩展变量$GOPATH,并列出目录的内容$GOPATH。我正在尝试对 Golang 的程序化 shell 执行做类似的事情。我有以下代码。package mainimport ( "bytes" "fmt" "log" "os" "os/exec")func main() { cmd := exec.Command("echo", "$TESTVAR") cmd.Env = append(os.Environ(), "TESTVAR=this_is_a_test", ) var outBuff bytes.Buffer var errBuff bytes.Buffer cmd.Stdout = &outBuff cmd.Stderr = &errBuff if err := cmd.Run(); err != nil { log.Fatal(err) } fmt.Println(outBuff.String()) // empty fmt.Println(errBuff.String()) // empty}这个程序输出$ go run test.go$TESTVAR有谁知道如何使 exec 库将 $TESTVAR 解释为环境变量而不是字符串文字?提前致谢!
2 回答
至尊宝的传说
TA贡献1789条经验 获得超10个赞
代替
cmd := exec.Command("echo", "$TESTVAR")
和
cmd := exec.Command("sh", "-c", "echo $TESTVAR")
紫衣仙女
TA贡献1839条经验 获得超15个赞
Bash 和其他 shell 解释和扩展变量,但应用程序不执行 Bash。
应用程序正在执行 echo 命令。与大多数其他命令一样,echo 命令不会在其参数中扩展环境变量。
您可以按照另一个答案中所示运行 Bash,也可以自行扩展环境变量。以下是使用os.Expand函数执行此操作的方法:
func newCommandEnv(env []string, cmd string, args ...string) *exec.Cmd {
m := map[string]string{}
for _, e := range env {
if i := strings.Index(e, "="); i >= 0 {
m[e[:i]] = e[i+1:]
}
}
fn := func(placeholder string) string {
return m[placeholder]
}
for i, a := range args {
args[i] = os.Expand(a, fn)
}
fmt.Println(args)
c := exec.Command(cmd, args...)
c.Env = env
return c
}
- 2 回答
- 0 关注
- 167 浏览
添加回答
举报
0/150
提交
取消