实时捕获命令执行标准输出
在执行命令的聊天机器人中,我们经常遇到需要显示脚本的标准输出聊天界面。虽然当前的实现会立即收集并返回整个标准输出,但我们寻求一种实时提供输出的解决方案。
检查给定的代码揭示了在单个函数调用中检索和返回标准输出的限制(重新启动())。为了实时输出文本,我们需要迭代执行命令并连续捕获 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中文网其他相关文章!