2017-10-13 7 views
1

J'essaie de diffuser la commande Stdout d'une commande shell vers la console, mais j'ai de la difficulté.Streaming exec.Command StdoutPipe

Voici ce que j'ai actuellement.

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') 
} 

je me attends à ce pour imprimer les chiffres de 0 à 10, mais il semble accrocher sur la ligne 3 (le premier appel à ReadString

I a commencé avec cmd.Output() et cmd.CombinedOutput(), mais ces méthodes semblent mettre en mémoire tampon le flux de sortie entier jusqu'à ce que la commande soit terminée.J'ai besoin de traiter la sortie comme elle flux, pas attendre jusqu'à ce que la commande soit terminée.J'ai aussi essayé ceci: continuously reading from exec.Cmd output, mais ça n'a pas l'air de marcher et je m'en suis éloigné parce que je veux vraiment lire les lignes et ne pas avoir à gérer le buffer manuellement.

D'autres choses que j'ai regardé par:

+0

Vraisemblablement, vous essayez de faire quelque chose de plus compliqué que cela, mais si vous ne voulez vraiment copier que la sortie de la commande vers stdout, il suffit d'assigner os.Stdout à cmd.Stdout. – Peter

+0

Je faisais quelque chose de plus compliqué que ça, mais j'apprécie le pourboire! Merci! – Joe

Répondre

2

Vous devez start la commande:

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') 
} 

Appelez Wait après avoir atteint EOF.

Les méthodes Output et CombinedOutput ont fonctionné pour vous parce que ces méthodes appellent Start interne.

+0

Oh mec, je me sens comme un idiot. Cela l'a résolu. Merci. – Joe