我如何将一组动态参数传递给Go的命令exec.Command?

时间:2014-04-01 09:30:06

标签: go command exec

我在这里遇到了一个关于将参数传递给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都是arg0arg1arg2arg3。将它们与要运行的实际命令一起传递到Command函数,在本例中为app var。

如果我有一系列的参数总是可能具有我想要传递的不确定性计数,那该怎么办?这可能吗?

3 个答案:

答案 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