给定一个任意字符串,如何将命令shell命中为bash?

时间:2015-03-15 22:05:50

标签: go

我有一个非常基本的golang问题。

给定"echo foo""CGO_ENABLED=0 go build -o ./bin/echo -a main.go"之类的任意字符串,使用os/exec解析/运行该命令的惯用方法是什么?

我开始工作的方式看起来很糟糕,而且我正在寻找一种更惯用的方法。

userInput = "CGO_ENABLED=0 go build -o ./bin/echo -a main.go"
command := exec.Command("/bin/bash", "-c", userInput)
out, err := command.Output()
if err != nil {
    fmt.Println(err)
 }

2 个答案:

答案 0 :(得分:0)

根据userInput字符串的任意性和灵活性,我可能会做这样的事情。

package main

import (
    "log"
    "os"
    "os/exec"
)

func main() {
    if err := os.Setenv("FOO", "bar"); err != nil {
        log.Println(err)
    }

    // As Dave C pointed out, exec.Command does this for you.
    // goAbsPath, err := exec.LookPath("go")
    // if err != nil {
    //   log.Println(err)
    // }

    // Pass whatever other arguments necessary.
    cmd := exec.Command("go", "version")
    if err = cmd.Run(); err != nil {
        log.Println(err)
    }
}

如果不出意外,可能os.Setenvexec.LookPath可能对您有用。

答案 1 :(得分:0)

我可能这样写:

cmd := exec.Command(cmdName, arg1, arg2, ..)   
cmd.Env = append(cmd.Env, "foo=bar")

err = cmd.Start()
if err != nil {
    // log or something else
}

err = cmd.Wait()
if err != nil {
    if exitErr, ok := err.(*exec.ExitError); ok {
        if status, ok := exitErr.Sys().(syscall.WaitStatus); ok {
            // handle err according to different status.ExitStatus()
        }
        // ...
    }
    // ...
}
// ...

如果您需要更多细节,Godoc会很好地解释。