从异步命令转到标准输出流
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
捕获输出并将其转发给 stdout
和 stderr
。
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())
}
我想使用 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
捕获输出并将其转发给 stdout
和 stderr
。
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())
}