2017-10-13 1 views
1

Ich versuche, die Stdout von einem Shell-Befehl auf die Konsole zu streamen, habe aber Schwierigkeiten.Streaming exec.Command StdoutPipe

Hier ist, was ich derzeit haben:.

cmd := exec.Command("sh", "-c", `for number in {0..10}; do echo "$number "; done;`) 
pipe, _ := cmd.StdoutPipe() 
reader := bufio.NewReader(pipe) 
line, err := reader.ReadString('\n') 
for err == nil { 
    fmt.Println(line) 
    line, err = reader.ReadString('\n') 
} 

Ich würde erwarten, dass diese 0 bis 10 aus den Zahlen drucken, aber es scheint auf der Linie 3 (den ersten Aufruf von ReadString

mir hängen gestartet mit cmd.Output() und cmd.CombinedOutput(), aber diese Methoden scheinen den gesamten Ausgabestrom zu puffern, bis der Befehl abgeschlossen ist.Ich muss die Ausgabe verarbeiten, wie es Streams, nicht warten, bis der Befehl abgeschlossen ist.

Ich habe das auch versucht: continuously reading from exec.Cmd output, aber es schien nicht zu funktionieren und ich ging davon weg, weil ich wirklich Zeilen lesen möchte und den Puffer nicht manuell verwalten muss.

Andere Dinge, die ich sah durch:

+0

Vermutlich versuchen Sie, etwas komplizierteres zu tun, aber wenn Sie nur die Ausgabe des Befehls in stdout kopieren möchten, weisen Sie os.Stdout einfach cmd.Stdout zu. – Peter

+0

Ich habe etwas komplizierter als das getan, aber ich schätze den Tipp! Vielen Dank! – Joe

Antwort

2

Sie müssen den Befehl start:

cmd := exec.Command("sh", "-c", `for number in {0..10}; do echo "$number "; done;`) 
pipe, _ := cmd.StdoutPipe() 
if err := cmd.Start(); err != nil { 
    // handle error 
} 
reader := bufio.NewReader(pipe) 
line, err := reader.ReadString('\n') 
for err == nil { 
    fmt.Println(line) 
    line, err = reader.ReadString('\n') 
} 

Rufen Sie Wait nach Erreichen von EOF.

Die Methoden Output und CombinedOutput funktionierten für Sie, weil diese Methoden intern Start aufrufen.

+0

Oh Mann, ich fühle mich wie ein Idiot. Das hat es gelöst. Vielen Dank. – Joe

Verwandte Themen