2017-10-13 9 views
1

シェルコマンドのStdoutをコンソールにストリーミングしようとしていますが、問題があります。ストリーミングexec.Command StdoutPipe

ここで私が現在持っているものだ:私はこれが10までの数字0をプリントアウトすることを期待する

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

が、ライン3(ReadStringの最初の呼び出し時にハングアップしているようだ

cmd.Output()cmd.CombinedOutput()で始まっていますが、これらのメソッドはコマンドが完了するまで出力ストリーム全体をバッファリングしているようですが、出力が完了するまで待つのではなく、出力を処理する必要があります。

私もこれを試しました:continuously reading from exec.Cmd output、しかし、それは動作していないようだと私は本当に行を読んで、手動でバッファを管理する必要はないので、私はそれから離れました。私が見てきたを通じて

他のもの:

+0

おそらくあなたはこれより複雑なことをしようとしていますが、本当にコマンドの出力をstdoutにコピーしたいのであれば、単にos.Stdoutをcmd.Stdoutに割り当ててください。 – Peter

+0

私はそれより複雑なことをしていましたが、私はこのヒントを感謝します!ありがとう! – Joe

答えて

2

あなたはコマンドを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') 
} 

EOFに達した後にWaitに電話してください。

これらのメソッドはStartを内部的に呼び出すため、OutputメソッドとCombinedOutputメソッドは役に立ちました。

+0

ああ、私は馬鹿のように感じますか?それがそれを解決しました。ありがとう。 – Joe

関連する問題