如何在仍然实时登录到OS.Stdout的同时解析exec.Command的输出?

uns*_*ero 0 go

在一个小的Go应用程序中,我正在使用os/exec包来运行命令.目前我通过设置传递日志输出:

cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
err := cmd.Run()
Run Code Online (Sandbox Code Playgroud)

我现在要做的是获取日志的输出(特别是第二行的第二行)并将其存储在变量中.我认为这将是为改变容易err := cmd.Run()cmdOutput, err := cmd.Output()和分析,因为我正在寻找的价值日志字符串-然而,这会触发一个错误说exec: Stdout already set.

我可以删除设置cmd.Stdout,但我仍然希望其余的日志输出以与现在相同的方式传递给当前进程.

我可以控制我正在炮轰的程序,所以如果有更好的方法将子命令/进程的JSON片段发送到父Go应用程序而不是将文件写入磁盘,那也可以.

任何帮助将不胜感激 - 我有点像golang磨砂膏...

Leo*_*eon 5

你可以和它io.MultiWriter一起使用bytes.Buffer:

var errBuf, outBuf bytes.Buffer
cmd.Stderr = io.MultiWriter(os.Stderr, &errBuf)
cmd.Stdout = io.MultiWriter(os.Stdout, &outBuf)
err := cmd.Run()
Run Code Online (Sandbox Code Playgroud)

这将仍然登录os.Stdoutos.Stderr,但您可以使用errBuf.Bytes()来获取错误输出,并outBuf.Bytes()获得正常输出.outBuf.Bytes()会给你一个等于返回的字节切片cmd.Output().