首頁 > 後端開發 > Golang > 如何在 Go 中檢索和處理 Shell 命令的即時輸出?

如何在 Go 中檢索和處理 Shell 命令的即時輸出?

Linda Hamilton
發布: 2024-12-11 04:40:14
原創
918 人瀏覽過

How to Retrieve and Process Real-Time Output from Shell Commands in Go?

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

在 Golang 中,os/exec 套件提供了執行 shell 指令的方法。但是,當這些命令返回即時輸出或進度更新時,有必要動態檢索和處理該資訊。以下是如何實現這一點:

要捕獲和處理Go 中shell 命令的即時輸出,請考慮以下方法:

package main<p>導入(</p><pre class="brush:php;toolbar:false">"bufio"
"fmt"
"io"
"os"
"os/exec"
"strings"
登入後複製

)

func main() {

cmdName := "ffmpeg -i t.webm  -acodec aac -vcodec libx264  cmd1.mp4"
cmdArgs := strings.Fields(cmdName)

cmd := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...)
stderr, _ := cmd.StderrPipe()
cmd.Start()
go printProgress(stderr)
cmd.Wait()
登入後複製

}

//stderr 換行時列印處理後的資訊
func printProgress(stderr io.ReadCloser) {

r := bufio.NewReader(stderr)
for {
    line, _, err := r.ReadLine()
    if err != nil {
        fmt.Println("error in reading from stderr:", err)
        break
    }

    // Process the line (e.g., extract the progress percentage)
    percentage, err := extractPercentage(string(line))
    if err != nil {
        fmt.Println("error in extracting percentage:", err)
        continue
    }

    // Print the updated progress ratio
    fmt.Printf("%s%%", percentage)
}
登入後複製


// extractPercentage解析ffmpeg輸出的行並傳回進度百分比。
// 假定問題中的輸出格式(例如,「frame=... size=... time=... bitrate=...」)

func extractPercentage (行字串) (字串, 錯誤) {
parts := strings.Split(line, " ")
if len(parts) < 4 {
    return "", fmt.Errorf("invalid line format: %s", line)
}

size := parts[2]
sizeUnits := []string{"B", "kB", "MB", "GB", "TB", "PB"}
for i, unit := range sizeUnits {
    if strings.HasSuffix(size, unit) {
        factor := float64(1 << (10 * i))
        sizeBytes, err := strconv.ParseFloat(strings.TrimSuffix(size, unit), 64)
        if err != nil {
            return "", err
        }

        percentage := (sizeBytes / factor) / 100
        return strconv.FormatFloat(percentage, 'f', 2, 64), nil
    }
}

return "", fmt.Errorf("unknown size unit: %s", size)
登入後複製


}

此方法使用管道來擷取指令的stderr流的即時輸出。它連續讀取和處理輸出,提取進度資訊並動態列印。請注意,本範例中的 extractPercentage 函數從 ffmpeg 輸出中提取百分比,假設問題中提到的特定格式。這可能需要根據你的 shell 命令的具體輸出格式進行調整。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板