为什么我在这个 Go 程序中使用 stderr 和 ioutil.ReadAll 得到

命令“psql”应该抛出一个错误,我正在尝试读取 stderr 并在 Go 程序中打印它。我使用 ioutil.ReadAll 从 stderr 和 stdout 读取数据。


不幸的是,它根本不是从 stderr 读取的。ioutil.ReadAll 返回一个错误,这不是我期望的错误。


我得到的错误是


read |0: bad file descriptor

这是代码。


package main


import (

        "fmt"

        "os/exec"

        "io/ioutil"

)


func main() {

        cmd := exec.Command("psql")

        stdout, err := cmd.StdoutPipe()

        if err != nil {

                fmt.Printf("Error: %s", err)

        }

        stderr, err := cmd.StderrPipe()

        if err != nil {

                fmt.Printf("Error: %s", err)

        }

        err = cmd.Start()

        if err != nil {

                fmt.Printf("Start error %s",err)

        }


        d := cmd.Wait()

        if d != nil {

                fmt.Println(d)

        }


        stdo,g := ioutil.ReadAll(stdout)

        stde,f := ioutil.ReadAll(stderr)


        if g != nil {

                fmt.Println(g)

        }


        if f !=nil {

                fmt.Println(f)

        }


        fmt.Printf("Standard err is %s \n", stde)

        fmt.Printf("Standard out is %s \n",stdo)

}


翻翻过去那场雪
浏览 255回答 1
1回答

潇潇雨雨

我发现通过实验,我收到了错误,因为我正在打电话   stdo,g := ioutil.ReadAll(stdout)   stde,f := ioutil.ReadAll(stderr)后 d := cmd.Wait()所以会发生什么是标准输出,标准错误管道在cmd.Wait()返回后关闭。下面是代码注释 cmd.StderrPipe()// StderrPipe returns a pipe that will be connected to the command's// standard error when the command starts.// The pipe will be closed automatically after Wait sees the command exit.所以很明显,我们无法在 stdout 和 stderr 关闭后读取它们。我们也无法在命令开始之前读取它们。所以我们必须把它们放在开始和等待之间。这是修复该问题的代码。package mainimport (        "fmt"        "os/exec"        "io/ioutil")func main() {        cmd := exec.Command("psql")        stdout, err := cmd.StdoutPipe()        if err != nil {                fmt.Printf("Error: %s", err)        }        stderr, err := cmd.StderrPipe()        if err != nil {                fmt.Printf("Error: %s", err)        }        err = cmd.Start()        if err != nil {                fmt.Printf("Start error %s",err)        }        stdo,g := ioutil.ReadAll(stdout)        stde,f := ioutil.ReadAll(stderr)        d := cmd.Wait()        if d != nil {                fmt.Println(d)        }        if g != nil {                fmt.Println(g)        }        if f !=nil {                fmt.Println(f)        }        fmt.Printf("Standard err is %s \n", stde)        fmt.Printf("Standard out is %s \n",stdo)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go