dsfsad089111 2019-03-09 00:22
浏览 197
已采纳

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

I am in a situation where I am trying to execute a shell command, but have its arguments be interpreted as environment variables properly.

For example, when I type the following into the terminal

ls $GOPATH

Bash interprets and expands the variable $GOPATH, and lists the contents of the $GOPATH directory. I am trying to do a similar thing with Golang's programmatic shell execution.

I have the following code.

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
}

This program outputs

$ go run test.go
$TESTVAR

Does anyone have any idea how to make the exec library interpret $TESTVAR as an environment variable as opposed to a string literal? Thanks in advance!

  • 写回答

2条回答 默认 最新

  • dtd14883 2019-03-09 01:09
    关注

    Replace

    cmd := exec.Command("echo", "$TESTVAR")
    

    with

    cmd := exec.Command("sh", "-c", "echo $TESTVAR")
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?