英文:
exec.Command setting output stream not getting all data
问题
这段代码的作用是执行Git命令,并将输出结果打印到标准输出和标准错误输出。第一段代码中,使用os.Stdout
和os.Stderr
将输出结果直接打印到标准输出和标准错误输出。
第二段代码中,使用io.MultiWriter(os.Stdout)
和io.MultiWriter(os.Stderr)
将输出结果写入多个写入器,但是会丢失一些正常情况下会看到的解析和接收输出。原因是io.MultiWriter
只是将输出结果写入多个写入器,但不会对输出结果进行处理。
第三段代码中,先将输出结果写入os.Stdout
和os.Stderr
,然后使用io.Copy
将输出结果复制到新的缓冲区stdout
和stderr
中。这样可以同时将输出结果打印到标准输出和标准错误输出,并且还可以将输出结果保存到缓冲区中供后续使用。这种方式可能显得有些冗余,但是可以实现预期的效果。
英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论