Go - 组合cmd.StdoutPipe和Cmd.StderrPipe

/ go / 没有评论 / 3237浏览

Go - 组合cmd.StdoutPipe和Cmd.StderrPipe

我想在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()
}

方法1

要将stdout和stderr组合到单个读取器,请将单个管道分配给Command.Stdout和Command.Stderr:

cmdReader, err := cmd.StdoutPipe()
cmd.Stderr = cmd.Stdout

方法2

使用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)