【发布时间】:2016-08-10 07:33:25
【问题描述】:
Streaming commands output progress问题解决了长时间运行命令的打印进度问题。
我试图将打印代码放在 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()
<-c
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
m := scanner.Text()
fmt.Println(m)
}
}(cmd, c)
cmd.Start()
c <- 1
cmd.Wait()
这个想法是启动 Goroutine,获取 cmd.stdout,等待 cmd 启动,然后开始处理它的输出。
结果是长命令被执行,程序等待它完成,但没有任何东西打印到终端。
知道为什么在第一次调用scanner.Scan() 时stdout 已经到达EOF?
【问题讨论】: