cmd 脚本编写 go执行脚本命令示例及源码分析

11/28 06:26:35 来源网站:辅助卡盟网

通过上面对exec.Command()源码的分析我们可以得知,这个函数只是寻找与path名字相同的可执行文件并且构建了一个Cmd的对象返回。这里值得注意的是,当我们输入的path如果不是一个可执行的文件的具体路径,那么就会去PATH环境变量中的注册的路径中找寻与path相同名字的命令,如果这个时候没有找到就会报错。

那么接下来我们那看看这个Cmd是何方神圣呢cmd 脚本编写,有什么用,怎么用呢。下面我们看看Cmd这个结构体里都有些什么东西。

// Cmd结构体代表一个准备或正在执行的外部命令
// 一个Cmd的对象不能在Run,Output或者CombinedOutput方法调用之后重复使用。
type Cmd struct {
   // Path代表运行命令的路径
   // 这个字段是唯一一个需要被赋值的字段,不能是空字符串,
   // 并且如果Path是相对路径,那么参照的是Dir这个字段的所指向的目录
   Path string

   // Args这个字段代表调用命令所需的参数,其中Path在运行命令时以Args[0]的形式存在
   // 如果这个参数是空,那个就直接使用Path运行命令
   //
   // 在较为普遍普遍的场景里面,Path和Args这两个参数在调用命令的时候都会被用到
   Args []string

   // Env代表当前进程的环境变量
   // 每个Env数组中的条目都以“key=value”的形式存在
   // 如果Env是nil,那边运行命令所创建的进程将使用当前进程的环境变量
   // 如果Env中存在重复的key,那么会使用这个key中排在最后一个的值。
   // 在Windows中存在特殊的情况, 如果系统中缺失了SYSTEMROOT,或者这个环境变量没有被设置成空字符串,那么它操作都是追加操作。
   Env []string

   // Dir代表命令的运行路径
   // 如果Dir是空字符串,那么命令就会运行在当前进程的运行路径
   Dir string

   // Stdin代表的是系统的标准输入流
   // 如果Stdin是一个*os.File,那么进程的标准输入将被直接连接到该文件。
   Stdin io.Reader

   // Stdout表示标准输出流
   // 如果StdOut是一个*os.File,那么进程的标准输入将被直接连接到该文件。
   // 值得注意的是如果StdOut和StdErr是同一个对象,那么同一时间只有一个协程可以调用Writer
   Stdout io.Writer
   Stderr io.Writer


   // ExtraFiles指定由新进程继承的额外开放文件。它不包括标准输入、标准输出或标准错误。如果不为零,第i项成为文件描述符3+i。
   // ExtraFiles前面三个元素分别放的是stdin,stdout,stderr
   // ExtraFiles在Windows上是不支持的
   ExtraFiles []*os.File

   SysProcAttr *syscall.SysProcAttr

   // 当命令运行之后,Process就是该命令运行所代表的进程
   Process *os.Process

   // ProcessState包含关于一个退出的进程的信息,在调用Wait或Run后可用。
   ProcessState *os.ProcessState

   ctx             context.Context // ctx可以用来做超时控制
   lookPathErr     error           // 如果在调用LookPath寻找路径的时候出错了,就赋值到这个字段
   finished        bool            // 当Wait被调用了一次之后就会被设置成True,防止被重复调用     
   childFiles      []*os.File
   closeAfterStart []io.Closer
   closeAfterWait  []io.Closer
   goroutine       []func() error  //一系列函数,在调用Satrt开始执行命令的时候会顺带一起执行这些函数。每个函数分配一个goroutine执行
   errch           chan error      // 与上一个字段联合使用,通过这个chan将上面函数执行的结果传到当前goroutine
   waitDone        chan struct{}
}

    暂无相关资讯
cmd 脚本编写 go执行脚本命令示例及源码分析