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