exec.command设置输出流未获取所有数据
This works
res = exec.Command(gitCmd, cmdArgs...)
res.Stdout, res.Stderr = os.Stdout,os.Stderr
When executing a git command like git clone ..
you get full syntax response like
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.
BUT if you wrap it in a multiwriter like this
res = exec.Command(gitCmd, cmdArgs...)
res.Stdout, res.Stderr = io.MultiWriter(os.Stdout),io.MultiWriter(os.Stderr)
You lose all the resolving / receiving outputs, that you normally see. Why ?
The following works but to me seems unnecessary, IMHO the io.MultiWriter should do the same ...
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)
这有效 p>
res = exec.Command(gitCmd, cmdArgs ...)
res.Stdout,res.Stderr = os.Stdout,os.Stderr
code> pre>
在执行git命令如 git clone时。 。 code>您将获得完整的语法响应,例如 p>
远程:计数对象:15,完成。
远程:压缩对象:100%(10/10),完成。
远程:总计15(增量4),已重用0(增量0)
接收对象:100%(15/15),已完成。
解决增量:100%(4/4),已完成。
code> pre>
但是,如果将其包装在这样的多层写入器中 p>
res = exec.Command(gitCmd,cmdArgs ...)
res .stdout,res.Stderr = io.MultiWriter(os.Stdout),io.MultiWriter(os.Stderr)
code> pre>
您丢失了所有解析/接收输出, 您通常会看到的。
为什么? p>
以下操作有效,但对我来说似乎是不必要的,恕我直言,io.MultiWriter应该执行相同的操作... p>
res = exec.Command(gitCmd,cmdArgs ...)
res.Stdout,res.Stderr = os.Stdout,os.Stderr
stdout,stderr = new(bytes.Buffer),new(bytes.Buffer)
go io。 复制(os.Stdout,stdout)
go io.Copy(os.Stderr,stderr)
code> pre>
div>
The difference is the TTY. Using a MultiWriter (or anything else) would break the TTY. If you want to do so, you need to use a PTY master/slave pair. You can take a look at https://github.com/kr/pty for more info.