cmd ;= exec.Command(cmdName, cmdParas...) 我自己平时用的有2类: cmd.Run() cmd.Start() + cmd.Wait() 下面简单介绍一下: 1、cmd.Run():直接执行,这个函数代码: ![111.jpg](http://studygolang.qiniudn.com/160705/1e4ede69c1b5182ad28cf9c813b78f81.jpg) 如果需要把执行的结果输出到标准输出上,不能用cmd.StdoutPipe()之类的函数,因为这些函数只有在命令执行完成之前有效,但是cmd.Run()命令是直接封装了cmd.Start()和cmd.Wait(),执行完cmd.Wait(),这个命令就已经执行完成了,所以不能用cmd.StdoutPipe()之类的函数; 可以在cmd定义和cmd.Run()之间,执行cmd.Stdout = os.Stdout,Stderr情况类似; 2、cmd.Start()开始执行一个命令,如果cmd.Start()成功了,后面必须跟cmd.Wait(). 这个函数可以给开发者一定的自由去在cmd.Start()和cmd.Wait()之间进行一些操作,简单做了一些总结: (1)cmd.Start()失败,返回error不为nil,那么命令就没有开始执行,后面也不用跟cmd.Wait()了; 注:Start()失败,应该都是命令本身失败。感觉Start的时候,还没开始按照参数执行,只是找不到命令对应的执行文件,就报错了。 (2)cmd.Wait()失败,返回的error不为nil,就是执行失败了,需要注意的是,参数不全的时候,会给出提示,但是也算是执行失败的,如安装了git的情况下,执行git,cmd.Wait()的退出码是1,也是执行失败。 (3)在cmd.Start()之前,获取命令的stderrPipe: stderr, err := cmd.StderrPipe() //stderr是一个*FILE类型 在cmdWait()之前,可以取stderr的内容,如果执行出错,能读取到错误信息。 举例: a、上面那个只执行git的情况:cmd.Wait()的退出码为1,标识执行失败,但是这时stderr里读不到东西(stderr.Read(bytes)出错,错误为EOF),提示信息应该是打在Stdout了,这里需要注意; b、在一个没有.git的目录执行git status: ![222.jpg](http://studygolang.qiniudn.com/160706/bea0e35fe45480472076df19b0ac85f9.jpg) 可以看到,上面的是从stderr中读到的信息,是比较有用的。 下面的是cmd.Wait()返回的错误,就是那个比较恶心的 128。 示例代码: ![333.jpg](http://studygolang.qiniudn.com/160706/f27c0717ff0e075f51d771e99d4ba17d.jpg)