exec.Command设置输出流没有获取所有数据

时间:2015-03-11 22:57:47

标签: go io

这有效

res = exec.Command(gitCmd, cmdArgs...)
res.Stdout, res.Stderr = os.Stdout,os.Stderr

执行像git clone ..这样的git命令时,您会得到完整的语法响应,如

remote: Counting objects: 15, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 15 (delta 4), reused 0 (delta 0)
Receiving objects: 100% (15/15), done.
Resolving deltas: 100% (4/4), done.

但如果你把它包装成像这样的多面打印机

res = exec.Command(gitCmd, cmdArgs...)
res.Stdout, res.Stderr = io.MultiWriter(os.Stdout),io.MultiWriter(os.Stderr)

您丢失了通常看到的所有解析/接收输出。 为什么?

以下作品对我来说似乎没必要,恕我直言io.MultiWriter也应该这样做......

res = exec.Command(gitCmd, cmdArgs...)
res.Stdout, res.Stderr = os.Stdout,os.Stderr
stdout, stderr = new(bytes.Buffer), new(bytes.Buffer)
go io.Copy(os.Stdout,stdout)
go io.Copy(os.Stderr,stderr)

1 个答案:

答案 0 :(得分:2)

区别在于TTY。使用MultiWriter(或其他任何东西)会破坏TTY。如果你想这样做,你需要使用PTY主/从对。您可以查看https://github.com/kr/pty了解更多信息。