繁体   English   中英

流式 exec.Command StdoutPipe

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM