问题:
在使用golang自带的调用命令时,不知道你们是否有遇到执行脚本已经完成,但是程序还在一直等待。
如果没有你不妨试一下在脚本中添加一个脚本,比如在 a.sh 中在执行b.sh 。这个时候你就会发现程序退不出来;当然不只是脚本中执行脚本的问题,还有在脚本中执行某些命令也会出现这样的问题。
为了方便使用,比如某些项目中的脚本太多,或者在不同的文件夹项目有相同的脚本,我们不妨把脚本都提出来,使用golang 写一个程序来调用这些脚本。
我们先说一下C语言调用脚本或者命令的方式:system() 就是调用的函数;
#include<stdlib.h>
int execCmd(char* name)
{
return system(name);
}
在golang中实现这个功能非常的简单:
package utils
/*
#include<stdlib.h>
int execCmd(char* name)
{
return system(name);
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func ExecCmd(name string,args ...string) error {
arg := ""
for _, s := range args {
arg += s +" "
}
cmd := C.CString(name + " " + arg)
defer C.free(unsafe.Pointer(cmd))
code := C.execCmd(cmd)
if code != 0 {
return fmt.Errorf("exec cmd failed , %v",cmd)
}
return nil
}
name : 调用的脚本或者命令;
args: 调用时传入的参数。
ExecCmd () 方法的具体实现可以自行研究。
使用方法如下:
err := utils.ExecCmd("ls", "-l")
if err != nil {
fmt.Println(err)
}
err := utils.ExecCmd("./test.sh")
if err != nil {
fmt.Println(err)
}
err := utils.ExecCmd("./test.sh", "1","2","3")
if err != nil {
fmt.Println(err)
}
到此结束,当然这使用的是C语言,所以需要在有C的环境中才能使用。