ホームページ >バックエンド開発 >Golang >Golang でシェル コマンドの標準エラーからリアルタイム出力をキャプチャして印刷する方法

Golang でシェル コマンドの標準エラーからリアルタイム出力をキャプチャして印刷する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-12-10 03:03:09424ブラウズ

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

Golang のシェル コマンドからリアルタイム出力を取得し、処理された情報を印刷する方法

このガイドでは、特定の内容に焦点を当てます。 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) {
    // ...
}

問題は、出力は標準出力に送信されますが、実際には、ffmpeg は代わりに診断メッセージを標準エラー出力に送信します。目的の出力をキャプチャするには、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 でシェル コマンドの標準エラーからリアルタイム出力をキャプチャして印刷する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。