Streaming exec.Command StdoutPipe

时间:2017-10-13 05:50:54

标签: shell go

我试图将shell命令的Stdout流式传输到控制台,但是遇到了困难。

这是我目前所拥有的:

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,但它似乎没有用,我离开了它,因为我真的想读行,而不必手动管理缓冲区。

我看过的其他事情:

1 个答案:

答案 0 :(得分:3)

您需要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。