首頁 >後端開發 >Golang >如何在 Go 中取得 Shell 指令的即時輸出?

如何在 Go 中取得 Shell 指令的即時輸出?

Barbara Streisand
Barbara Streisand原創
2024-12-08 18:51:15481瀏覽

How to Get Realtime Output from Shell Commands in Go?

如何在Go 中擷取Shell 指令的即時輸出

問題:

執行長時間執行的shell 指令時在使用os/exec 的Go 中,如何檢索即時輸出並在其變為時對其進行處理可用嗎?

解:

  1. 使用stderr 而非stdout:

    訊息輸出到stderr 而不是stdout。因此,在建立命令物件時,請連接到 stderr 而不是 stdout。

  2. 連續讀取 stderr 的輸出:

    建立 bufio.Scanner stderr 並使用 Scan方法逐行或逐字讀取輸出word.

  3. 逐行處理輸出:

    在範例程式碼中,使用了scanner.Split (bufio.ScanWords)來分割空格上的輸出。根據您的處理要求調整拆分類型。

  4. 處理輸出:

    以您想要的方式操作輸出,例如擷取和處理進度資訊。

範例程式碼:

package main

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

func main() {
    args := "-i test.mp4 -acodec copy -vcodec copy -f flv rtmp://aaa/bbb"
    cmd := exec.Command("ffmpeg", strings.Split(args, " ")...)

    stderr, _ := cmd.StderrPipe()
    cmd.Start()

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

輸出:

訊息,如:

以上是如何在 Go 中取得 Shell 指令的即時輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn