【问题标题】:Streaming exec.Command StdoutPipe流式 exec.Command StdoutPipe
【发布时间】:2017-10-13 05:50:53
【问题描述】:

我正在尝试将 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()cmd.CombinedOutput() 开始,但这些方法似乎会缓冲整个输出流,直到命令完成。我需要在输出流式传输时对其进行处理,而不是等到命令完成。

我也试过这个:continuously reading from exec.Cmd output,但它似乎不起作用,我放弃了它,因为我真的想读取行而不需要手动管理缓冲区。

我看过的其他内容:

【问题讨论】:

  • 可能你正在尝试做一些比这更复杂的事情,但如果你真的只想将命令的输出复制到标准输出,只需将 os.Stdout 分配给 cmd.Stdout。
  • 我正在做一些比这更复杂的事情,但我很感激这个提示!谢谢!
  • @Peter 您能否发表您的评论作为答案?我来到这里寻找同样的问题,我认为你的评论实际上是我寻求的答案

标签: shell go


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2021-08-04
    相关资源
    最近更新 更多