网上看到过一份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 代表你执行脚本这个命令