ホームページ > バックエンド開発 > Golang > コマンド実行の標準出力をリアルタイムでキャプチャする方法

コマンド実行の標準出力をリアルタイムでキャプチャする方法

Linda Hamilton
リリース: 2024-11-02 07:44:29
オリジナル
576 人が閲覧しました

How to Capture Command Execution stdout in Real Time?

コマンド実行の stdout をリアルタイムでキャプチャする

コマンドを実行するチャットボットでは、スクリプト内のスクリプトの stdout を表示する必要がよくあります。チャットインターフェイス。現在の実装では標準出力全体を一度に収集して返しますが、リアルタイムで出力を提供するソリューションを模索しています。

指定されたコードを検査すると、単一の関数呼び出しで標準出力が取得されて返されるという制限があることがわかります。 (リブート())。リアルタイムでテキストを出力するには、実行コマンドを反復処理し、stdout を継続的にキャプチャする必要があります。

このソリューションの鍵は、StdoutPipe メソッドを利用することです。これにより、出力をキャプチャするためのパイプを作成できます。実行されたコマンド。コマンドの標準出力のパイプを確立することで、出力を継続的に読み取って表示できます。

改善されたコード:

<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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート