在Go中实时打印exec命令中的stdout

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

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

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

echo "Start"

sleep 7s

echo "Done"

在我当前的实现中,用户仅在完成完整命令后才能看到输出。在上面的示例中,用户直到命令和第二次完成才看到输出 Startsleep``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中实时打印exec命令中的stdout 的全部内容, 来源链接: utcz.com/qa/420104.html

回到顶部