2017-10-13 39 views
1

我正嘗試將shell命令的Stdout流式傳輸到控制檯,但遇到了困難。Streaming exec.Command StdoutPipe

這是我目前有:

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

我希望它可以打印出數字0至10,但它似乎掛在3號線(至ReadString第一個呼叫

我從cmd.Output()cmd.CombinedOutput()開始,但是這些方法似乎緩衝了整個輸出流,直到命令完成。我需要在輸出流時處理輸出,而不是等到命令完成。我也試過這個:continuously reading from exec.Cmd output,但它似乎沒有工作,我離開它,因爲我真的想讀取行而不必手動管理緩衝區。

其他的事情我已經看了通過:

+0

假設你正在嘗試做比這更復雜的事情,但如果你真的只想複製命令的輸出到標準輸出,只需將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

Output和CombinedOutput方法適用於您,因爲這些方法在內部調用Start。

+0

哦,我覺得自己像個白癡。這解決了它。謝謝。 – Joe