我想在Go中执行一个命令,并将其stdout和stderr组合成一个流.我写了这段代码,它只读取了stdout,但我不知道如何将它与stderr结合起来:
package main
import (
"fmt"
"os"
"os/exec"
"bufio"
)
func runCommand() {
var (
err error
)
cmdName := "docker"
cmdArgs := []string{"build", "--no-cache=true", "--force-rm=true", "."}
cmd := exec.Command(cmdName, cmdArgs...)
cmdReader, err := cmd.StdoutPipe()
if err != nil {
fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
}
scanner := bufio.NewScanner(cmdReader)
go func() {
for scanner.Scan() {
fmt.Printf("docker build out | %s\n", scanner.Text())
}
}()
err = cmd.Start()
if err != nil {
fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
}
err = cmd.Wait()
if err != nil {
fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
}
}
func main() {
runCommand()
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的回答!
Cer*_*món 10
要将stdout和stderr组合到单个读取器,请将单个管道分配给Command.Stdout和Command.Stderr:
cmdReader, err := cmd.StdoutPipe()
cmd.Stderr = cmd.Stdout
Run Code Online (Sandbox Code Playgroud)
使用该函数io.MultiReader将多个阅读器合并为一个:
outReader, err := cmd.StdoutReader()
if err != nil {
// handle err
}
errReader, err := cmd.StderrReader()
if err != nil {
// handle err
}
cmdReader := io.MultiReader(outReader, errReader)
Run Code Online (Sandbox Code Playgroud)