【发布时间】:2017-10-02 00:04:01
【问题描述】:
我正在寻找一种将 stdout 和 stderr 作为一个流同时处理的方法。 对于标准输出,我可以使用:
cmd := exec.Command(command, flags...)
var wg sync.WaitGroup
stdout, err := cmd.StdoutPipe()
if err != nil {
return fmt.Errorf("RunCommand: cmd.StdoutPipe(): %v", err)
}
if err := cmd.Start(); err != nil {
return fmt.Errorf("RunCommand: cmd.Start(): %v", err)
}
scanner := bufio.NewScanner(stdout)
scanner.Split(ScanLinesR)
wg.Add(1)
go func() {
for scanner.Scan() {
text := scanner.Text()
if strings.TrimSpace(text) != "" {
DoWhateverYouNeedWithText(text)
}
}
wg.Done()
}()
wg.Wait()
但是如何将 stderr 添加到相同的代码中?
【问题讨论】:
-
复制stderr的stdout代码(创建管道,添加一个到等待组,启动goroutine)。
-
如果您需要串行处理这些行,请复制 stderr 的 stdout 代码,但不要在这些 goroutine 中的每一行上调用您的函数,而是将每一行写入一个通道并使用第三个 goroutine 读取通道并处理线路。