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)
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2020/08/09 05:13