Как передать динамический набор аргументов команде Go exec.Command?

Я столкнулся с вопросом, связанным с аргументами, передаваемыми функции 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.

Что, если бы у меня был массив аргументов, которые всегда, возможно, имели неопределенный подсчет, который я хотел пройти. Возможно ли это?

Ответ 1

Вот так:

args := []string{"what", "ever", "you", "like"}
cmd := exec.Command(app, args...)

Посмотрите язык и учебник на golang.org.

Ответ 2

Вы можете попробовать с библиотекой флагов, которая сработала для меня. Это другой пример, но он использует концепцию принятия динамических аргументов.

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