Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menangkap dan Mencetak Output Masa Nyata daripada Ralat Standard Perintah Shell di Golang?

Bagaimana untuk Menangkap dan Mencetak Output Masa Nyata daripada Ralat Standard Perintah Shell di Golang?

Susan Sarandon
Lepaskan: 2024-12-10 03:03:09
asal
373 orang telah melayarinya

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

Cara Mendapatkan Keluaran Masa Nyata dan Mencetak Maklumat Diproses daripada Perintah Shell di Golang

Dalam panduan ini, kami akan menumpukan pada satu senario di mana kami melaksanakan perintah shell yang menghasilkan output dalam masa nyata, seperti ffmpeg. Kami berhasrat untuk mendapatkan semula output ini secara berterusan dan mencetak maklumat yang diproses berdasarkan data yang diberikannya.

Mari kita pecahkan kod asal dan jelaskan isu ini:

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) {
    // ...
}
Salin selepas log masuk

Isunya terletak pada andaian output akan dihantar ke stdout, tetapi sebenarnya, ffmpeg menghantar mesej diagnostik kepada stderr sebaliknya. Untuk menangkap output yang dikehendaki, kita perlu menyalurkan aliran stderr. Berikut ialah kod yang disemak yang menangani perkara ini:

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()
}
Salin selepas log masuk

Kini, kod dibaca daripada paip stderr dan mencetak perkataan yang diterimanya. Ini memastikan bahawa kami menangkap dan memaparkan mesej diagnostik yang dijana oleh ffmpeg.

Sebagai contoh, jika bar kemajuan ffmpeg kelihatan seperti ini:

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/
Salin selepas log masuk

Kod kami akan menangkap dan mencetak perkataan ini sebaris baris:

frame=
101
fps=
0.0
q=
28.0
size=
91kB
time=
00:00:04.13
bitrate=
181.2kbits/
... (and so on)
Salin selepas log masuk

Anda kemudian boleh menggunakan perkataan ini untuk menghuraikan maklumat yang berkaitan dan mengemas kini kemajuan anda sewajarnya.

Atas ialah kandungan terperinci Bagaimana untuk Menangkap dan Mencetak Output Masa Nyata daripada Ralat Standard Perintah Shell di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan