执行任何命令突然报错ioutil.ReadAll error read |0: file already closed
![image.png](https://static.studygolang.com/190226/4edf8584ab59f7474cac217119b94de9.png)
更多评论
1.cmd := exec.Command("/bin/sh/", "-c", "linux命令")
2.cmd := exec.Command("cmd", "/C", "windows命令")
如果想执行windows下命令行的话,应该用2而不是1.
#1
因为命令没有正确识别,所以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