为了账号安全,请及时绑定邮箱和手机立即绑定

在Go中重定向子进程的stdout管道

在Go中重定向子进程的stdout管道

Go
牛魔王的故事 2021-05-06 19:20:24
我正在用Go编写程序,该程序执行类似程序的服务器(也就是Go)。现在,我想在启动父程序的终端窗口中获得子程序的标准输出。一种实现方法是使用cmd.Output()函数,但这仅在进程退出后才输出标准输出。(这是一个问题,因为这个类似于服务器的程序运行了很长时间,并且我想读取日志输出)变量out是,type io.ReadCloser我不知道该如何使用它来完成任务,因此我在网络上找不到任何有关此主题的有用信息。func main() {    cmd := exec.Command("/path/to/my/child/program")    out, err := cmd.StdoutPipe()    if err != nil {        fmt.Println(err)    }    err = cmd.Start()    if err != nil {        fmt.Println(err)    }    //fmt.Println(out)    cmd.Wait()} 对代码的解释:取消注释该Println函数以获取要编译的代码,我知道这Println(out io.ReadCloser)不是一个有意义的函数。(它产生输出&{3 |0 <nil> 0})只需两行即可编译代码。
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

我相信,如果导入ioos与替换此:

//fmt.Println(out)

有了这个:

go io.Copy(os.Stdout, out)

(见文档io.Copyos.Stdout),它会做你想要什么。(免责声明:未经测试。)

顺便说一句,您可能还想通过使用与标准输出相同的方法来捕获标准错误,但是要使用cmd.StderrPipeos.Stderr


查看完整回答
反对 回复 2021-05-10
?
慕标5832272

TA贡献1966条经验 获得超4个赞

对于那些不需要循环使用但希望命令输出回显到终端而又不会cmd.Wait()阻塞其他语句的用户:


package main


import (

    "fmt"

    "io"

    "log"

    "os"

    "os/exec"

)


func checkError(err error) {

    if err != nil {

        log.Fatalf("Error: %s", err)

    }

}


func main() {

    // Replace `ls` (and its arguments) with something more interesting

    cmd := exec.Command("ls", "-l")


    // Create stdout, stderr streams of type io.Reader

    stdout, err := cmd.StdoutPipe()

    checkError(err)

    stderr, err := cmd.StderrPipe()

    checkError(err)


    // Start command

    err = cmd.Start()

    checkError(err)


    // Don't let main() exit before our command has finished running

    defer cmd.Wait()  // Doesn't block


    // Non-blockingly echo command output to terminal

    go io.Copy(os.Stdout, stdout)

    go io.Copy(os.Stderr, stderr)


    // I love Go's trivial concurrency :-D

    fmt.Printf("Do other stuff here! No need to wait.\n\n")

}


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 272 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信