首页 > 后端开发 > Golang > 如何在 Golang 中捕获并打印 Shell 命令标准错误的实时输出?

如何在 Golang 中捕获并打印 Shell 命令标准错误的实时输出?

Susan Sarandon
发布: 2024-12-10 03:03:09
原创
374 人浏览过

How to Capture and Print Realtime Output from a Shell Command's Standard Error in Golang?

如何从 Golang 中的 Shell 命令检索实时输出并打印处理后的信息

在本指南中,我们将重点关注特定的我们执行实时产生输出的 shell 命令的场景,例如 ffmpeg。我们的目标是稳定地检索此输出,并根据它提供的数据打印处理后的信息。

让我们分解原始代码并解释问题:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "os/exec"
    "strings"
)

func main() {
    // ...
    stdout, _ := cmd.StdoutPipe()
    cmd.Start()
    go print(stdout)
    cmd.Wait()
}

func print(stdout io.ReadCloser) {
    // ...
}
登录后复制

问题在于假设输出将发送到 stdout,但实际上,ffmpeg 会将诊断消息发送到 stderr。为了捕获所需的输出,我们需要通过管道传输 stderr 流。下面是解决此问题的修订后的代码:

func main() {
    // ...
    stderr, _ := cmd.StderrPipe()
    cmd.Start()

    scanner := bufio.NewScanner(stderr)
    scanner.Split(bufio.ScanWords)
    for scanner.Scan() {
        m := scanner.Text()
        fmt.Println(m)
    }
    cmd.Wait()
}
登录后复制

现在,代码从 stderr 管道读取并打印它接收到的单词。这确保我们捕获并显示 ffmpeg 生成的诊断消息。

例如,如果 ffmpeg 的进度条如下所示:

frame=  101 fps=0.0 q=28.0 size=      91kB time=00:00:04.13 bitrate= 181.2kbits/
frame=  169 fps=168 q=28.0 size=     227kB time=00:00:06.82 bitrate= 272.6kbits/
frame=  231 fps=153 q=28.0 size=     348kB time=00:00:09.31 bitrate= 306.3kbits/
frame=  282 fps=140 q=28.0 size=     499kB time=00:00:11.33 bitrate= 360.8kbits/
登录后复制

我们的代码将逐行捕获并打印这些单词line:

frame=
101
fps=
0.0
q=
28.0
size=
91kB
time=
00:00:04.13
bitrate=
181.2kbits/
... (and so on)
登录后复制

然后您可以使用这些单词来解析相关信息并相应地更新您的进度。

以上是如何在 Golang 中捕获并打印 Shell 命令标准错误的实时输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板