首页  >  文章  >  后端开发  >  如何实时捕获命令执行标准输出?

如何实时捕获命令执行标准输出?

Linda Hamilton
Linda Hamilton原创
2024-11-02 07:44:29482浏览

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