go - 在 Go 中实时打印来自 exec 命令的标准输出

标签 go exec stdout

<分区>

我有一个小的 Go 工具,基本上允许用户定义一个命令,然后使用 os/exec 运行。

我的问题是我想向用户显示命令的输出 (stdout/stderr)。

一个例子可能是这样的: 用户定义一个命令,最后是sh test.shtest.sh 的内容:

echo "Start"
sleep 7s
echo "Done"

在我当前的实现中,用户只能在完整命令完成后才能看到输出。在上面的示例中,在 sleep 命令和第二个 echo 完成之前,用户不会看到输出 Start

我目前像这样检索命令的输出:

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())

是否有可能以某种方式实时读取标准输出/标准错误。意思是一旦用户定义的命令创建并输出它就会被打印出来?

最佳答案

谢谢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 - 在 Go 中实时打印来自 exec 命令的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253268/

相关文章:

unit-testing - Golang - 使用文件系统进行测试并达到 100%

http - 在 golang 服务器中面临 cors 问题

java - 执行非 native MacOS 终端命令 - 截断以创建新文件 - 在 Java 代码中

c - 执行调用

go - 来自字符串的 int

c - 执行功能。有没有办法回到主程序?

python - 使用 Python 进行交互式输入/输出

将 sys.stdout 缓冲区设置为零的 Python 标准习惯用法不适用于 Unicode

c - 没有 fflush(stdout) 输出不打印

date - 如何将字符串时间戳转换为我可以显示的 UTC 日期?