我有一个非常基本的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)
}
答案 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.Setenv
和exec.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会很好地解释。