在 Go 版本 1.14.2 中,以下是一些示例代码,它说明了生成命令、通过标准输入向其提供数据、然后捕获其标准输出和标准错误的常用方法。它使用管道,但是如果 stdout 或 stderr 管道的缓冲区在进程完成之前已满,这可能会导致程序阻塞(此示例中省略了错误处理)...func ExecExample(cmd *exec.Cmd, input *[]byte) { stdout, err := cmd.StdoutPipe() stderr, err := cmd.StderrPipe() stdin, err := cmd.StdinPipe() err = cmd.Start() stdin.Write(*input) stdin.Close() stdoutBytes, err := ioutil.ReadAll(stdout) stderrBytes, err := ioutil.ReadAll(stderr) waitErr := cmd.Wait()}如何在 Go 中重构这个示例代码,以便 stdout 和 stderr 管道永远不会阻塞?另外,请注意,我正在寻找一种方法来分别捕获 stdout 和 stderr 输出。我不希望它们结合在一起。先感谢您。
2 回答
Cats萌萌
TA贡献1805条经验 获得超9个赞
让 exec 包为您完成工作。
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
cmd.Stdin = bytes.NewReader(*input)
err := cmd.Run()
stdoutBytes := stdout.Bytes()
stderrBytes := stderr.Bytes()
exec 包创建和管理将数据泵入和输出子进程所需的 goroutine。
慕妹3242003
TA贡献1824条经验 获得超6个赞
在 goroutine 中读取一个(或两个)流:
var stderrBytes []byte
go func() {
stderrBytes, _ = ioutil.ReadAll(stderr)
}()
err = cmd.Start()
stdoutBytes, err := ioutil.ReadAll(stdout)
- 2 回答
- 0 关注
- 214 浏览
添加回答
举报
0/150
提交
取消
