从异步命令转到标准输出流

Go stdout stream from async command

我想使用 GO 运行 windows 10 上的异步命令。我正在 运行ning 的命令是阻塞的,如果 运行 直接从终端它提供持续不断的状态消息流,直到 ctrl-c

我想 运行 通过 exec 从 GO 命令并实时捕获 exec 命令的输出到终端,即不仅在 GO 应用程序终止时。

我尝试了很多例子但没有成功,我只是得到一个空白终端,甚至在退出 GO 应用程序后,我也看不到我执行的命令的输出。

您可以使用 cmd.StdoutPipe 来做到这一点:

cmd := exec.Command(cmdName, cmdArgs...)
cmdReader, _ := cmd.StdoutPipe()
scanner := bufio.NewScanner(cmdReader)
done := make(chan bool)
go func() {
    for scanner.Scan() {
        fmt.Printf(scanner.Text())
    }
    done <- true
}()
cmd.Start()
<- done
err = cmd.Wait()

您可以使用 io.MultiWriter 捕获输出并将其转发给 stdoutstderr

var stdoutBuf, stderrBuf bytes.Buffer

cmd := exec.Command("/some-command")
cmd.Stdout = io.MultiWriter(os.Stdout, &stdoutBuf)
cmd.Stderr = io.MultiWriter(os.Stderr, &stderrBuf)
err := cmd.Start()  // Starts command asynchronously

if err != nil {
    fmt.Printf(err.Error())
}