Go阻塞式执行sh脚本

网上看到过一份Go 调用shell 程序的代码,先贴在这里,亲测可用,没有问题

// ExecShell 执行shell 命令
func ExecShell(s string) (string, error) {
	//函数返回执行输出,如果有错误返回错误
	s += " 2>&1 | tee mylog.log" //将标准输出和错误重定向到本地日志
	cmd := exec.Command("/bin/bash", "-c", s) //-c 代表视 传入的命令字符串为一个整体,里面的所有命令都要执行
	//读取io.Writer类型的cmd.Stdout,再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口)
	stdout, err := cmd.StdoutPipe()
	cmd.Start()
	//创建一个流来读取管道内内容
	reader := bufio.NewReader(stdout)
	var out string
	//实时循环读取输出流中的一行内容
	for {
		line, err2 := reader.ReadString('\n')
		if err2 != nil || io.EOF == err2 {
			break
		}
		out += line
	}
	//阻塞直到该命令执行完成,该命令必须是被Start方法开始执行的
	cmd.Wait()

	//完成后返回所有的执行结果

	return string(out), err
}

但是使用中发现,如果我想执行的不是命令,而是一份脚本,那么如果你把脚本地址传进去,看起来似乎是

/bin/bash -c jioben.sh 

结果报错,employ bash shell: No such file or directory

实际上将这条命令输入到shell终端中,你会发现又是执行是对的

答案很简单, 你不能传入这个脚本地址,而是执行脚本的这条命令

也就是/bin/bash jiaoben.sh

这里之所以会出现两个/bin/bash ,因为第一个/bin/bash 代表你要用命令行

而第二个/bin/bash 代表你执行脚本这个命令

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值