如何将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
。怎么让他们回来?也许有一些更优雅的管道解决方案?
答案 0 :(得分:5)
使用参数os.Stdout和文件创建io.MultiWriter。将Cmd.Stdout设置为多路写入器。运行命令。
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。