为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ibeautiful 2023-06-12 16:58:38
我正处于尝试执行 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")


查看完整回答
反对 回复 2023-06-12
?
紫衣仙女

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

}


查看完整回答
反对 回复 2023-06-12
  • 2 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信