流式命令从Goroutine输出进度

流式命令从Goroutine输出进度,go,execution,Go,Execution,问题解决了打印长时间运行的命令的进度问题 我试图将打印代码放入goroutine中,但扫描仪声称已立即命中EOF,并且for块从未执行 第一次执行scan()方法时执行的bufio.scan代码是: // We cannot generate a token with what we are holding. // If we've already hit EOF or an I/O error, we are done. if s.err != nil {

问题解决了打印长时间运行的命令的进度问题

我试图将打印代码放入goroutine中,但扫描仪声称已立即命中
EOF
,并且for块从未执行

第一次执行
scan()
方法时执行的
bufio.scan
代码是:

    // We cannot generate a token with what we are holding.
    // If we've already hit EOF or an I/O error, we are done.
    if s.err != nil {
        // Shut it down.
        s.start = 0
        s.end = 0
        return false
    }
如果我打印
s.err
,则输出为
EOF

我尝试运行的代码是:

cmd:=exec.Command(“some”,“Command”)
c:=make(chan int,1)
go func(cmd*exec.cmd,c chan int){
stdout,:=cmd.StdoutPipe()
存在一些问题:
  • 在读取所有数据之前,正在关闭管道
  • 始终检查错误
  • 在godocs的
    c之后启动
    cmd.Start()

    StdoutPipe返回将连接到命令的 命令启动时的标准输出

    Wait将在看到命令退出后关闭管道,因此大多数 调用者不需要自己关闭管道;但是,这意味着 在管道中的所有读取完成之前调用Wait是不正确的 完成

    启动命令后立即调用
    Wait()
    。因此,在确保已从管道读取所有数据之前,命令完成后管道将立即关闭。请尝试在扫描循环后将
    Wait()
    移动到go例程

    go func(cmd *exec.Cmd, c chan int) {
        stdout, _ := cmd.StdoutPipe()
    
        <-c
    
        scanner := bufio.NewScanner(stdout)
        for scanner.Scan() {
            m := scanner.Text()
            fmt.Println(m)
        }
    
        cmd.Wait()
        c <- 1
    }(cmd, c)
    
    cmd.Start()
    c <- 1
    
    // This is here so we don't exit the program early,
    <-c
    
    谢谢,1)很好。如果我想同时处理Stdout和Stderr,我想我可以使用2个通道和2个go例程(每种管道类型一个)。
    cmd := exec.Command("some", "command")
    cmd.Stdout = os.Stdout
    cmd.Run()