exec.command设置输出流未获取所有数据

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.