exec调用linux命令,exec执行shell命令简单总结

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)

有疑问加站长微信联系(非本文作者)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值