首頁 >後端開發 >Golang >如何即時串流命令輸出而不是等待執行完成?

如何即時串流命令輸出而不是等待執行完成?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-17 21:00:03400瀏覽

How to Stream Command Output in Real-time Instead of Waiting for Execution Completion?

運行命令並串流其輸出

問題:延遲輸出顯示

當前,您的程式碼處理一個命令並僅在執行完成後顯示其輸出。您尋求一種即時串流輸出的解決方案,而不是等待進程完成。

解決方案:指令輸出流

採用以下方法來串流指令輸出:

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
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:])
}

說明

  • cmd.StdoutPipe()建立一個管道,該管道將提供命令寫入的任何輸出。
  • scanner := bufio.NewScanner(stdout) 初始化將從管道讀取輸出的掃描器。
  • scanner.Split(bufio.ScanRunes) 確保掃描器讀取並處理輸出的每個字元(符文)。
  • for 循環不斷從 stdout 管道讀取字元並將其列印到螢幕上。
  • 指令執行完成後,cmd.Wait() 檢查其成功或失敗並記錄結果。

以上是如何即時串流命令輸出而不是等待執行完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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