[英]Streaming exec.Command StdoutPipe
我正在尝试将 shell 命令的标准输出 stream 发送到控制台,但是遇到了困难。
这是我目前拥有的:
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
。
I started with cmd.Output()
and cmd.CombinedOutput()
, but those methods seem to buffer the entire output stream until the command is complete. 我需要在流式传输时处理 output,而不是等到命令完成。
我也试过这个: 不断地从 exec.Cmd output 读取,但它似乎没有用,我离开了它,因为我真的想读取行而不必手动管理缓冲区。
我看过的其他内容:
您需要启动命令:
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后致电“ 等待” 。
Output和CombinedOutput方法对您有用,因为这些方法在内部调用Start。
这与 cerise-limón 的答案略有不同,但我需要 output 到 stream 到控制台,因为它出现了。 此外,我的命令从未产生 EOF。
在 go 例程中包装读取的缓冲区允许它继续将 output 泵送到控制台,同时cmd.Wait()
等待命令完成。 由于Wait
关闭了StdoutPipe
,一旦命令完成,它将导致reader.ReadString
出错,退出例程。
cmd := exec.Command(someCommand, someArg)
pipe, _ := cmd.StdoutPipe()
if err := cmd.Start(); err != nil {
// handle error
}
go func(p io.ReadCloser) {
reader := bufio.NewReader(pipe)
line, err := reader.ReadString('\n')
for err == nil {
fmt.Println(line)
line, err = reader.ReadString('\n')
}
}(pipe)
if err := cmd.Wait(); err != nil {
// handle error
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.