首頁  >  文章  >  後端開發  >  如何即時擷取指令執行標準輸出?

如何即時擷取指令執行標準輸出?

Linda Hamilton
Linda Hamilton原創
2024-11-02 07:44:29485瀏覽

How to Capture Command Execution stdout in Real Time?

即時擷取指令執行標準輸出

在執行指令的聊天機器人中,我們常常會遇到需要顯示腳本的標準輸出聊天介面。雖然當前的實作會立即收集並返回整個標準輸出,但我們尋求一種即時提供輸出的解決方案。

檢查給定的程式碼揭示了在單一函數呼叫中檢索和返回標準輸出的限制(重新啟動())。為了即時輸出文本,我們需要迭代執行命令並連續捕獲 stdout。

這個解決方案的關鍵是利用 StdoutPipe 方法,它允許我們建立一個管道來捕獲輸出已執行的命令。透過為命令的 stdout 建立管道,我們可以連續讀取並顯示輸出。

改進的程式碼:

<code class="go">package main

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

func main() {
    // Specify the command to execute
    cmd := exec.Command("command", "arguments")

    // Create a pipe for the output of the script
    cmdReader, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
        return
    }

    scanner := bufio.NewScanner(cmdReader)

    // Launch a goroutine to continuously read and display the output
    go func() {
        for scanner.Scan() {
            fmt.Printf("\t > %s\n", scanner.Text())
        }
    }()

    // Start the execution of the command
    err = cmd.Start()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
        return
    }

    // Wait for the command to complete
    err = cmd.Wait()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
        return
    }
}</code>

在這個改進的解決方案中,我們不斷地讀取goroutine 中命令的stdout 的輸出,允許在聊天介面中即時顯示stdout。這消除了對大緩衝區的需要,並避免在單一函數呼叫中返回整個標準輸出,從而解決了原始問題。

以上是如何即時擷取指令執行標準輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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