登录
首页 >  Golang >  Go问答

捕获主进程标准输出并将子进程输出打印到控制台

来源:stackoverflow

时间:2024-02-27 17:39:23 209浏览 收藏

从现在开始,努力学习吧!本文《捕获主进程标准输出并将子进程输出打印到控制台》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

我正在开发 cli。 cli 写入标准输出,我想在 bash 变量中捕获它。也就是说,我希望能够做到这一点:

output=$(my_cli_command)

我的 cli 还在该命令中运行一个子进程。我希望在执行 output=$(my_cli_command) 时将子进程的输出打印到终端。

运行子进程时我必须做什么才能确保它 (1) 打印到控制台,但 (2) 没有捕获到 output 变量中?或者这不可能吗?

我正在用 go 编写 cli。我在这里放置了一个可重现的示例:

package main

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

func main() {
    fmt.println("i want this captured")

    // i don't want this captured, but i want "ls" printed to console
    command := exec.command("ls")
    // with these lines, the print statement and the ls statement are printed to console.
    // all are captured in a bash variable.
    command.stdout = os.stdout
    command.stderr = os.stderr
    
    command.run()

}

将其复制到文件 main.go 中并按如下方式运行:

output=$(go run main.go)
echo "$output"

谢谢。


正确答案


这不是 bash 问题,而是 go 问题。如果您不希望捕获 ls 的输出,请将其标准输出连接到 go 程序的标准错误而不是其标准输出。

package main

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

func main() {
    fmt.Println("I want this captured")

    command := exec.Command("ls")
    command.Stdout = os.Stderr // not os.Stdout
    command.Stderr = os.Stderr
    command.Run()
}

终于介绍完啦!小伙伴们,这篇关于《捕获主进程标准输出并将子进程输出打印到控制台》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>