【发布时间】:2015-06-18 19:29:45
【问题描述】:
我正在尝试通过管道输出命令的输出,但在关闭写入端之前似乎没有从管道中读取任何数据。最终,我希望它连接到一个 websocket,该 websocket 在执行命令时流式传输命令的状态。问题是虽然这段代码逐行打印消息,但在程序完成执行之前它不会打印任何内容。
cmd := exec.Command(MY_SCRIPT_LOCATION, args)
// create a pipe for the output of the script
// TODO pipe stderr too
cmdReader, err := cmd.StdoutPipe()
if err != nil {
fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
return
}
scanner := bufio.NewScanner(cmdReader)
go func() {
for scanner.Scan() {
fmt.Printf("\t > %s\n", scanner.Text())
}
}()
err = cmd.Start()
if err != nil {
fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
return
}
err = cmd.Wait()
if err != nil {
fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
return
}
有没有什么办法可以做类似的事情,让扫描仪在写入管道时逐行读取,而不是在所有内容都写入之后?程序运行大约需要 20 秒,并且有源源不断的更新,所以一次全部通过很烦人。
【问题讨论】:
-
@icza 感谢您将我指向那里,但不幸的是它并没有太大帮助。那里的人与我的设置几乎相同。起初我认为问题在于它无法读取我文件中的换行符,但
scanner.Scan()循环在输出的每一行执行一次,因此扫描分隔符应该可以正常工作 -
你试过把
cmd.StdoutPipe连接到os.Stdout吗?
标签: go