Ich muss Unterbefehl von gehen und stdout und stderr getrennt verarbeiten, mit der Reihenfolge der Ausgabe, die zu stdin/stdout kommt. Ich habe mehrere verschiedene Wege ausprobiert, aber konnte nicht die richtige Reihenfolge der Ausgabe erreichen; folgender Code zeigt, dass ouput Handhabung, um absolut zufällig ist:Go: Empfangen os.cmd stdout und stderr in Reihenfolge
package main
import (
"fmt"
"log"
"os/exec"
)
var (
result = ""
)
type writer struct {
result string
write func(bytes []byte)
}
func (writer *writer) Write(bytes []byte) (int, error) {
writer.result += string(bytes) // process result later
result += string(bytes)
return len(bytes), nil
}
func main() {
cmd := exec.Command("bash", "-c", "echo TEST1; echo TEST2 1>&2; echo TEST3")
stderr := &writer{}
cmd.Stderr = stderr
stdout := &writer{}
cmd.Stdout = stdout
err := cmd.Start()
if err != nil {
log.Fatal(err)
}
err = cmd.Wait()
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
}
Mit mehreren Läufen Code ausgegeben folgenden:
$ go run main.go
TEST1
TEST3
TEST2
Ich erwarte, dass folgendes Ergebnis in allen Fällen:
$ go run main.go
TEST1
TEST2
TEST3
ich kann Rufen Sie nicht cmd.CombinedOutput auf, da ich stdout/stderr separat und in Echtzeit verarbeiten muss.
ähm .. aus irgendeinem Grunde produzieren, ich Ihr Problem nicht reproduzieren kann. Ich bekomme immer TEST1 TEST2 TEST3 –
@ bshuster13 Ich kann das auf Ubuntu 14.04 reproduzieren. –
Bitte schauen Sie sich das an: http://StackOverflow.com/Questions/4497817/Save-Stdout-Stderr-and-Stdoutstderr-synchronous –