Go - 合并 cmd.StdoutPipe 和 Cmd.StderrPipe

Go - Combining cmd.StdoutPipe and 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()
}

谢谢大家的回答!

要将 stdout 和 stderr 合并为单个 reader,请将单个管道分配给 Command.Stdout 和 Command.Stderr:

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

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