我在这里遇到了一个关于将参数传递给Go的exec.Command
函数的问题,我想知道是否有办法动态传递这些参数?以下是sed问题的一些示例代码:
package main
import "os/exec"
func main() {
app := "echo"
//app := "buah"
arg0 := "-e"
arg1 := "Hello world"
arg2 := "\n\tfrom"
arg3 := "golang"
cmd := exec.Command(app, arg0, arg1, arg2, arg3)
out, err := cmd.Output()
if err != nil {
println(err.Error())
return
}
print(string(out))
}
因此,您可以看到上面定义的每个arg都是arg0
,arg1
,arg2
和arg3
。将它们与要运行的实际命令一起传递到Command
函数,在本例中为app
var。
如果我有一系列的参数总是可能具有我想要传递的不确定性计数,那该怎么办?这可能吗?
答案 0 :(得分:37)
像这样:
args := []string{"what", "ever", "you", "like"}
cmd := exec.Command(app, args...)
查看golang.org上的语言和教程。
答案 1 :(得分:1)
您可以尝试对我有用的flag library。这是一个不同的示例,但是它使用了接受动态参数的概念。
package main
import (
"flag"
"log"
"os/exec"
"strings"
)
func main() {
flag.Parse()
arg1, arg2 := strings.Join(flag.Args()[:1], " "), strings.Join(flag.Args()[1:], " ")
cmd := exec.Command(arg1, arg2)
err := cmd.Start()
if err != nil {
log.Fatal(err)
}
log.Printf("Waiting for command to finish...")
log.Printf("Process id is %v", cmd.Process.Pid)
err = cmd.Wait()
log.Printf("Command finished with error, now restarting: %v", err)
}
像这样运行
$ go run main.go node ../web-test/index.js
2019/01/26 13:32:29 Waiting for command to finish...
2019/01/26 13:32:29 Process id is 3582
答案 2 :(得分:1)
对于那些通过谷歌搜索引擎在未来阅读本文的人,我留下了新的解决方案。
在 go 1.16 中,像上面的答案一样传递切片现在会导致编译错误。
app := "echo"
args := []string{"what", "ever", "you", "like"}
cmd := exec.Command(app, args...) // <- ERROR!
但是您可以将参数传递给 cmd.Args
app := "echo"
args := []string{app, "what", "ever", "you", "like"}
cmd := exec.Command(app)
cmd.Args = args