Ответ 1
Вот так:
args := []string{"what", "ever", "you", "like"}
cmd := exec.Command(app, args...)
Посмотрите язык и учебник на golang.org.
Я столкнулся с вопросом, связанным с аргументами, передаваемыми функции 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.
Что, если бы у меня был массив аргументов, которые всегда, возможно, имели неопределенный подсчет, который я хотел пройти. Возможно ли это?
Вот так:
args := []string{"what", "ever", "you", "like"}
cmd := exec.Command(app, args...)
Посмотрите язык и учебник на golang.org.
Вы можете попробовать с библиотекой флагов, которая сработала для меня. Это другой пример, но он использует концепцию принятия динамических аргументов.
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