首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流exec.Command StdoutPipe

流exec.Command StdoutPipe
EN

Stack Overflow用户
提问于 2017-10-13 05:50:53
回答 2查看 5.6K关注 0票数 8

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

以下是我目前的情况:

代码语言:javascript
复制
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()开始,但是这些方法似乎会缓冲整个输出流,直到命令完成。我需要在输出流中进行处理,而不是等到命令完成后再处理。

我也尝试过这样的方法:从exec.Cmd输出连续读取,但它似乎不起作用,我放弃了它,因为我真的想读行,而不必手动管理缓冲区。

其他我看过的东西:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-13 06:07:39

您需要开始命令:

代码语言:javascript
复制
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后打电话给

输出和CombinedOutput方法适用于您,因为这些方法调用内部启动。

票数 14
EN

Stack Overflow用户

发布于 2022-09-14 19:32:50

这与cerise-limón的答案略有不同,但我需要输出流到控制台。此外,我的命令从来没有产生过EOF。

将缓冲区读取到go例程中,使其能够继续将输出泵到控制台,而cmd.Wait()则等待命令完成。由于Wait关闭了StdoutPipe,一旦命令完成,它将导致reader.ReadString出错,从而退出例程。

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46723308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档