当前位置: 首页 > 工具软件 > go-sh > 使用案例 >

Go阻塞式执行sh脚本

公孙锋
2023-12-01

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

 

 

 类似资料: