在 Go 中执行 exec 时,如何获得正在运行的命令的输出?

Har*_*nce 2 command exec go

到目前为止,我已经看到了几种不同的方式,您可以通过这些方式轻松地在 go 中执行 shell 命令并生成它的输出。但是,在程序仍在运行时会输出大量命令,例如,git clone ...

如果git clone http://some.repo.git使用以下内容执行:

out, err := exec.Command("...").Output()

似乎没有任何输出,因为它显然正在运行。或者至少在我的经验中似乎是这样。是否有一种简单的方法或模式可以实现来显示正在运行的命令的实时输出?

thw*_*hwd 5

您可以获得连接到命令的管道stdout

cmd := exec.Command("...")

pipe, err := cmd.StdoutPipe()
Run Code Online (Sandbox Code Playgroud)

然后启动命令:

err := cmd.Start()
Run Code Online (Sandbox Code Playgroud)

并读取其输出(定期如此频繁):

b := make([]byte, 1024, 1024)

n, err := pipe.Read(b)

// b contains up to 1024 characters of cmd's output
Run Code Online (Sandbox Code Playgroud)

最后,用一个排空的管道(管道中没有输出),调用Wait等待命令退出:

err := cmd.Wait()
Run Code Online (Sandbox Code Playgroud)