Exec a shell command in Go
None of the provided answers allow to separate stdout
and stderr
so I try another answer.
First you get all the info you need, if you look at the documentation of the exec.Cmd
type in the os/exec
package. Look here: https://golang.org/pkg/os/exec/#Cmd
Especially the members Stdin
and Stdout
,Stderr
where any io.Reader
can be used to feed stdin
of your newly created process and any io.Writer
can be used to consume stdout
and stderr
of your command.
The function Shellout
in the following programm will run your command and hand you its output and error output separatly as strings:
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
const ShellToUse = "bash"
func Shellout(command string) (error, string, string) {
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd := exec.Command(ShellToUse, "-c", command)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
return err, stdout.String(), stderr.String()
}
func main() {
err, out, errout := Shellout("ls -ltr")
if err != nil {
log.Printf("error: %v\n", err)
}
fmt.Println("--- stdout ---")
fmt.Println(out)
fmt.Println("--- stderr ---")
fmt.Println(errout)
}
The package "exec" was changed a little bit. The following code worked for me.
package main
import (
"fmt"
"os/exec"
)
func main() {
app := "echo"
arg0 := "-e"
arg1 := "Hello world"
arg2 := "\n\tfrom"
arg3 := "golang"
cmd := exec.Command(app, arg0, arg1, arg2, arg3)
stdout, err := cmd.Output()
if err != nil {
fmt.Println(err.Error())
return
}
// Print the output
fmt.Println(string(stdout))
}
I hope this helps!