Go 执行命令设置输出流未获取所有数据

Go 执行命令设置输出流未获取所有数据,go,io,Go,Io,这很有效 res = exec.Command(gitCmd, cmdArgs...) res.Stdout, res.Stderr = os.Stdout,os.Stderr 执行git命令时,如git clone..会得到完整的语法响应,如 remote: Counting objects: 15, done. remote: Compressing objects: 100% (10/10), done. remote: Total 15 (delta 4), reused 0 (del

这很有效

res = exec.Command(gitCmd, cmdArgs...)
res.Stdout, res.Stderr = os.Stdout,os.Stderr
执行git命令时,如
git clone..
会得到完整的语法响应,如

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)

区别在于TTY。使用多写器(或其他任何东西)会破坏TTY。如果要这样做,需要使用PTY主/从对。您可以查看更多信息。

git
可能会在打印出额外信息之前检查是否为“标准错误”。这是因为它“打印”了
\r
字符以跳转到行首以更新百分比等。。如果输出文件不是终端,那么这种行为是不可取的。这是有道理的,在这种情况下,变通(使用go io.Copy)工作得足够好,因为它不必是准确的历史记录。我只是想展示一些活动,io.MultiWriter什么也没给我。感谢您的回答和链接。。