【发布时间】:2018-02-18 08:00:31
【问题描述】:
我使用以下代码有效,问题是在进程完成执行时打印输出, 我想将输出实时打印到屏幕上,并且在进程完成时不提供所有输出,我该如何实现?
cmdParams := [][]string{
{filepath.Join(dir,path), "npm", "install"},
{filepath.Join(pdir,n.path), "gulp"},
}
for _, cp := range cmdParams {
log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
cmd := exec.Command(cp[1], cp[2:]...)
cmd.Dir = cp[0]
// Wait to finish, get output:
out, err := cmd.Output()
if err != nil {
log.Printf("Error running %s: %v\n", cp[1:], err)
return
}
log.Println("Finished %s, output: %s", cp[1:], out)
}
更新在尝试提出的解决方案时,我得到了类似的输出
2018/02/18 11:11:57 Starting [npm install] in folder ...
2018/02/18 11:12:14 adde
2018/02/18 11:12:14 d 56
2018/02/18 11:12:14 3 pa
2018/02/18 11:12:14 ckag
2018/02/18 11:12:14 es i
2018/02/18 11:12:14 n 15
2018/02/18 11:12:14 .477
2018/02/18 11:12:14 s
2018/02/18 11:12:14 Finished %s [npm install]
【问题讨论】:
-
@icza - 所以我应该在这种情况下使用
oneByte := make([]byte, 1) for { _, err := stdout.Read(oneByte) if err != nil { break } fmt.Printf("%c", oneByte[0]) }吗?如果是的话在哪里?这有点令人困惑...... -
使用建议副本的已接受答案中的解决方案。
-
@icza - 你是说 -
scanner := bufio.NewScanner(stdout) scanner.Split(bufio.ScanRunes)吗? -
@icza - 如果你能提供我的上下文示例,那就太好了,因为我阅读了这篇文章并且它有所不同,我运行了几个命令,我使用了
cmd.Output(),我不明白如何把它们联系起来……
标签: go