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

huangapple go评论78阅读模式
英文:

exec.Command setting output stream not getting all data

问题

这段代码的作用是执行Git命令,并将输出结果打印到标准输出和标准错误输出。第一段代码中,使用os.Stdoutos.Stderr将输出结果直接打印到标准输出和标准错误输出。

第二段代码中,使用io.MultiWriter(os.Stdout)io.MultiWriter(os.Stderr)将输出结果写入多个写入器,但是会丢失一些正常情况下会看到的解析和接收输出。原因是io.MultiWriter只是将输出结果写入多个写入器,但不会对输出结果进行处理。

第三段代码中,先将输出结果写入os.Stdoutos.Stderr,然后使用io.Copy将输出结果复制到新的缓冲区stdoutstderr中。这样可以同时将输出结果打印到标准输出和标准错误输出,并且还可以将输出结果保存到缓冲区中供后续使用。这种方式可能显得有些冗余,但是可以实现预期的效果。

英文:

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)

答案1

得分: 2

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

英文:

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.

huangapple
  • 本文由 发表于 2015年3月12日 06:57:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/28998965.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定