I came across a question on here relating to arguments being passed to Go's exec.Command
function, and I was wondering if there was a way do pass these arguments dynamically? Here's some sample code from sed question:
package main
import "os/exec"
func main() {
app := "echo"
//app := "buah"
arg0 := "-e"
arg1 := "Hello world"
arg2 := "
\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))
}
So as you can see each arg is defined above as arg0
, arg1
, arg2
and arg3
. They are passed into the Command
function along with the actual command to run, in this case, the app
var.
What if I had an array of arguments that always perhaps had an indeterministic count that I wanted to pass through. Is this possible?
Like this:
args := []string{"what", "ever", "you", "like"}
cmd := exec.Command(app, args...)
Have a look at the language and tutorial on golang.org.
You can try with the flag library, which has worked for me. This is a different example but it uses the concept of accepting dynamic arguments.
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)
}
And running like this
$ 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