执行任何命令比如l s突然报错ioutil.ReadAll error read |0: file already closed

golang_gc · · 2962 次点击
haoyupei
大道至简,始终如一
cmd.wait()
#2
更多评论
1.cmd := exec.Command("/bin/sh/", "-c", "linux命令") 2.cmd := exec.Command("cmd", "/C", "windows命令") 如果想执行windows下命令行的话,应该用2而不是1.
#1
haoyupei
大道至简,始终如一
因为命令没有正确识别,所以out读取不到内容 使用 cmd.Start()的可以通过返回值来查看 命令是否可以执行,之后的流程就对了 ```go package main import ( "fmt" "io" _ "io/ioutil" "os" "os/exec" "bytes" ) func main() { cmd_os := "" if "windows" == os.Getenv("GOOS") { cmd_os = "dir" }else{ cmd_os = "ls" } cmd := exec.Command(cmd_os) out ,err := cmd.StdoutPipe() if err!=nil{ fmt.Println(err) } var errbuf bytes.Buffer cmd.Stderr = &errbuf err = cmd.Start() if err!=nil{ io.Copy(cmd.Stderr,bytes.NewBufferString(err.Error())) //fmt.Println(err) } //cont,err:= ioutil.ReadAll(out) _,err = io.Copy(os.Stdout,out) if err!=nil{ //fmt.Println(err) } //io.Copy(os.Stdout,out) cmd.Wait() // fmt.Println(bytes.NewBuffer(cont).String()) fmt.Println(errbuf.String()) //io.Copy(os.Stdout,cmd.Stderr) //io.Copy(os.Stdout,os.Stdin) //fmt.Println(os.Args[1]) } ```
#3