在程序化 shell 命令执行中嵌入环境变量

我正处于尝试执行 shell 命令的情况,但它的参数被正确解释为环境变量。


例如,当我在终端中输入以下内容时


ls $GOPATH

Bash 解释并扩展变量$GOPATH,并列出目录的内容$GOPATH。我正在尝试对 Golang 的程序化 shell 执行做类似的事情。


我有以下代码。


package main


import (

    "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 解释为环境变量而不是字符串文字?提前致谢!


ibeautiful
浏览 168回答 2
2回答

至尊宝的传说

代替cmd := exec.Command("echo", "$TESTVAR")和cmd := exec.Command("sh", "-c", "echo $TESTVAR")

紫衣仙女

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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go