命令“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)
}
最佳答案
我发现,由于我打电话给我,通过实验我发现了错误
stdo,g := ioutil.ReadAll(stdout)
stde,f := ioutil.ReadAll(stderr)
后
d := cmd.Wait()
所以发生的是
cmd.Wait()
返回后,stdout,stderr管道关闭。这是
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 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)
}
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)
}