首頁  >  文章  >  後端開發  >  如何在 Go 中串流命令輸出以獲取即時結果?

如何在 Go 中串流命令輸出以獲取即時結果?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-20 13:32:17385瀏覽

How to Stream Command Output in Go for Live Results?

即時結果的串流命令輸出

在Go 中執行命令可讓您與外部進程交互,但如果您需要即時輸出,有一種方法來實現它。

在您的程式碼片段中,指令完成後會立即列印所有輸出。要即時顯示輸出,您可以結合下面概述的技術:

// ... Previous code

for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}

// ... Remaining code

說明

此修改使用 bufio.Scanner 即時讀取命令的標準輸出。 Split(bufio.ScanRunes) 指示掃描器讀取單一字符,這使您可以在產生輸出時顯示輸出。

重複呼叫scanner.Scan() 並列印scanner.Text() 直到到達輸出結尾時,您可以在螢幕上即時傳輸命令的輸出。

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

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