我正在尝试将 shell 命令的标准输出流式传输到控制台,但遇到困难。
这是我目前拥有的:
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()
and cmd.CombinedOutput()
,但这些方法似乎会缓冲整个输出流,直到命令完成。我需要在输出流时处理输出,而不是等到命令完成。
我也尝试过这个:连续读取 exec.Cmd 输出 https://stackoverflow.com/questions/43635611/continuously-reading-from-exec-cmd-output,但它似乎不起作用,我放弃了它,因为我真的想读取行,而不必手动管理缓冲区。
我看过的其他事情:
- https://groups.google.com/forum/#!topic/golang-nuts/0xK_IHbHPUU https://groups.google.com/forum/#!topic/golang-nuts/0xK_IHbHPUU
- https://golang.org/pkg/os/exec/ https://golang.org/pkg/os/exec/
- https://golang.org/pkg/bufio/ https://golang.org/pkg/bufio/
你需要start https://godoc.org/os/exec#Cmd.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')
}
Call Wait https://godoc.org/os/exec#Cmd.Wait达到EOF后。
Output 和 CombinedOutput 方法对您有用,因为这些方法在内部调用 Start。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)