在 Go 中实时打印来自 exec 命令的标准输出
Print the stdout from exec command in real time in Go
我有一个小的 Go 工具,它基本上允许用户定义一个命令,该命令将 运行 使用 os/exec
。
我的问题是我想向用户显示命令的输出 (stdout/stderr)。
示例可能如下所示:
用户定义了一个命令,最后是sh test.sh
。
test.sh的内容:
echo "Start"
sleep 7s
echo "Done"
在我当前的实现中,用户只能在完整命令完成后才能看到输出。在上面的示例中,用户不会看到输出 Start,直到 sleep
命令和第二个 echo
完成。
我目前像这样检索命令的输出:
cmd := exec.Command(command, args...)
cmd.Dir = dir
// Attach to the standard out to read what the command might print
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Panic(err)
}
// Execute the command
if err := cmd.Start(); err != nil {
log.Panic(err)
}
buf := new(bytes.Buffer)
buf.ReadFrom(stdout)
log.Print(buf.String())
是否可以实时读取stdout/stderr。意思是一旦用户定义的命令创建并输出它就会被打印出来?
谢谢mh-cbon。这把我推向了正确的方向。
代码现在看起来像这样,并且完全符合我的要求。我还发现,当我使用 Run()
而不是 Start()
时,程序的执行只会在命令完成后继续。
cmd := exec.Command(command, args...)
cmd.Dir = dir
var stdBuffer bytes.Buffer
mw := io.MultiWriter(os.Stdout, &stdBuffer)
cmd.Stdout = mw
cmd.Stderr = mw
// Execute the command
if err := cmd.Run(); err != nil {
log.Panic(err)
}
log.Println(stdBuffer.String())
我有一个小的 Go 工具,它基本上允许用户定义一个命令,该命令将 运行 使用 os/exec
。
我的问题是我想向用户显示命令的输出 (stdout/stderr)。
示例可能如下所示:
用户定义了一个命令,最后是sh test.sh
。
test.sh的内容:
echo "Start"
sleep 7s
echo "Done"
在我当前的实现中,用户只能在完整命令完成后才能看到输出。在上面的示例中,用户不会看到输出 Start,直到 sleep
命令和第二个 echo
完成。
我目前像这样检索命令的输出:
cmd := exec.Command(command, args...)
cmd.Dir = dir
// Attach to the standard out to read what the command might print
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Panic(err)
}
// Execute the command
if err := cmd.Start(); err != nil {
log.Panic(err)
}
buf := new(bytes.Buffer)
buf.ReadFrom(stdout)
log.Print(buf.String())
是否可以实时读取stdout/stderr。意思是一旦用户定义的命令创建并输出它就会被打印出来?
谢谢mh-cbon。这把我推向了正确的方向。
代码现在看起来像这样,并且完全符合我的要求。我还发现,当我使用 Run()
而不是 Start()
时,程序的执行只会在命令完成后继续。
cmd := exec.Command(command, args...)
cmd.Dir = dir
var stdBuffer bytes.Buffer
mw := io.MultiWriter(os.Stdout, &stdBuffer)
cmd.Stdout = mw
cmd.Stderr = mw
// Execute the command
if err := cmd.Run(); err != nil {
log.Panic(err)
}
log.Println(stdBuffer.String())