我正在尝试将命令的输出进行管道传输,但是在写端关闭之前似乎没有从管道中读取任何数据。最终,我希望将其连接到一个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秒,且有持续的更新流,因此将它们全部一起通过是很烦人的。
scanner.Scan()
循环每行输出执行一次,因此扫描分隔符应该没问题。 - mrosalescmd.StdoutPipe
直接连接到os.Stdout
吗? - Not_a_Golfer