Вам нужно читать из читателя, возвращенного из "io.TeeReader" асинхронно. Вот пример, который делает нечто похожее на то, что, я думаю, вы пытаетесь сделать.
package main
import (
"bytes"
"fmt"
"io"
"log"
"os"
"os/exec"
)
func main() {
prout, pwout := io.Pipe()
prerr, pwerr := io.Pipe()
cmd := exec.Command("sh", "-c", "echo this is stdout; echo 1>&2 this is stderr")
cmd.Stdout = pwout
cmd.Stderr = pwerr
tout := io.TeeReader(prout, os.Stdout)
terr := io.TeeReader(prerr, os.Stderr)
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
var bout, berr bytes.Buffer
go func() {
if _, err := io.Copy(&bout, tout); err != nil {
log.Fatal(err)
}
}()
go func() {
if _, err := io.Copy(&berr, terr); err != nil {
log.Fatal(err)
}
}()
if err := cmd.Wait(); err != nil {
log.Fatal(err)
}
fmt.Printf("buffered out %s", bout.String())
fmt.Printf("buffered err %s", berr.String())
}
Вывод:
this is stdout
this is stderr
buffered out this is stdout
buffered err this is stderr
И программа должна завершиться и успешно завершиться .