В соответствии с примерами официальной документации, exec.Cmd.Ouput() ([]byte, error)
даст вам выход команды после ее завершения.
https://golang.org/pkg/os/exec/#Cmd.Output
package main
import (
"fmt"
"log"
"os/exec"
)
func main() {
out, err := exec.Command("date").Output()
if err != nil {
log.Fatal(err)
}
fmt.Printf("The date is %s\n", out)
}
Для получения как stdout, так и stderrпроцесса, писатель должен использовать exec.Cmd.CombinedOutput
https://golang.org/pkg/os/exec/#Cmd.CombinedOutput
Если кто-то хочет получить вывод команды в режиме реального времени на свой терминал, то писатель должен установить свойства exec.Cmd.Stdout
и exec.Cmd.Stderr
соответственно, os.Stdout
и os.Stderr
и вызовите метод exec.Cmd.Run() error
.
https://golang.org/pkg/os/exec/#Cmd https://golang.org/pkg/os/exec/#Cmd.Run
package main
import (
"fmt"
"log"
"os"
"os/exec"
)
func main() {
cmd := exec.Command("date")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("The date is %s\n", out)
}
Для переадресации выходов и одновременной записи ихАвтор должен обратиться за помощью к пакету io
, чтобы использовать io.MultiWriter
https://golang.org/pkg/io/#MultiWriter
package main
import (
"fmt"
"io"
"log"
"os"
"os/exec"
)
func main() {
stdout := new(bytes.Bufer)
stderr := new(bytes.Bufer)
cmd := exec.Command("date")
cmd.Stdout = io.MultiWriter(os.Stdout, stdout)
cmd.Stderr = io.MultiWriter(os.Stderr, stderr)
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("The date is %s\n", out)
}
В качестве альтернативы, вы можете использовать exec.Cmd.{Stdout,Stderr}Pipe()
, см. официальную документациюпримеры https://golang.org/pkg/os/exec/#Cmd.StdoutPipe