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)
有疑问加站长微信联系(非本文作者)