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

So far I've seen a few different ways whereby you can easily execute a shell command in go and yield it's output. However, there are a ton of commands that output while the program is still running, for example, git clone ...

If git clone http://some.repo.git is executed using something like:

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

There doesn't seem to be any output as it's running obviously. Or at least in my experiance that seems to be the case. Is there a simple way or pattern that can be implemented to show the live output of the command that is being ran?

You can get a pipe connected to the command's stdout:

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

pipe, err := cmd.StdoutPipe()

Then start the command:

err := cmd.Start()

and read its output (periodically ever so often):

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

n, err := pipe.Read(b)

// b contains up to 1024 characters of cmd's output

in the end, and with a drained pipe (no output left in the pipe), call Wait to wait for the command to exit:

err := cmd.Wait()