小编典典

如何通过os.Exec将stdout传输到文件和终端?

go

如何通过管道将os.Exec的stdout发送到文件,同时也发送到终端?

我已经试过了:

go func() {
    scanner := bufio.NewScanner(stdout)
    writer := bufio.NewWriter(logFile)
    for scanner.Scan() {
        log.Debugln(scanner.Text())
        writer.WriteString(scanner.Text())
    }
    writer.Flush()
}()

但是文件writer.WriteString(scanner.Text())丢失\n了。如何让他们回来?也许管道有一些更优雅的解决方案?


阅读 285

收藏
2020-07-02

共1个答案

小编典典

使用参数os.Stdout和文件创建io.MultiWriter。将Cmd.Stdout设置为multiwriter。运行命令。

 cmd := exec.Command(name, args...)
 cmd.Stdout = io.MultiWriter(os.Stdout, file)
 err := cmd.Run()

如果要逐行写入log.Debugf和其他文件,请执行以下操作:

go func() {
    scanner := bufio.NewScanner(stdout)
    writer := bufio.NewWriter(io.MultiWriter(os.Stdout, file))
    for scanner.Scan() {
        log.Debugln(scanner.Text())
        writer.Write(scanner.Bytes())
        writer.WriteByte('\n')  // add line separator
    }
    writer.Flush()
}()

此代码假定输入中的行分隔符为\ n。

2020-07-02