当前位置:   article > 正文

Golang笔记:使用exec包执行外部程序与Shell命令_golang exec

golang exec

目的

程序中执行外部程序是比较常用的功能,Golang执行外部程序可以使用标准库中的 os/exec https://pkg.go.dev/os/exec 。这个包默认是用来执行外部程序的,可以通过调用Shell程序来执行Shell命令。这篇文章将对相关使用做个记录,方便自己查阅。

使用演示

使用 func Command(name string, arg ...string) *Cmd 可以建立一个要执行的命令对象, name 是要执行的程序, arg 是参数。

使用 func (c *Cmd) CombinedOutput() ([]byte, error) 方法可以运行命令,并返回标准输出和标准错误:
在这里插入图片描述
在这里插入图片描述

CombinedOutput 方法会阻塞程序直到执行结束:
在这里插入图片描述

可以调用Shell程序来执行Shell命令:
在这里插入图片描述

使用 func (c *Cmd) Start() error 可以启动命令,并不等待程序返回,这时候使用 func (c *Cmd) Wait() error 方法来阻塞直到程序结束:
在这里插入图片描述

Start 方法通常还可以和下面几个方法结合使用:
func (c *Cmd) StderrPipe() (io.ReadCloser, error)
func (c *Cmd) StdinPipe() (io.WriteCloser, error)
func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
这几个方法分别返回标准错误、标准输入、标准输出相关联的管道。 Wait 方法等到命令结束后会关闭这些管道。

在这里插入图片描述

如果使用的是前面阻塞的方式的话,会等到命令结束后才会输出消息。

os/exec 包中还提供了很多方法来执行相关操作,大多都是 Start 方法之上一层层的封装(包括前面的 CombinedOutput 方法)。

另外可以使用 func CommandContext(ctx context.Context, name string, arg ...string) *Cmd 方法来执行程序,该方式下可以使用上下文 ctx 相关的 Cancel 函数来提前终止程序进程:
在这里插入图片描述

Cmd结构体

type Cmd struct {
	Path         string               // 程序路径,如果使用相对路径,则会使用相对于下面Dir的路径
	Args         []string             // 程序执行参数
	Env          []string             // 程序运行环境变量,如果未指定则使用当前程序的环境变量
	Dir          string               // 程序执行的工作目录,如果未指定则使用当前程序的目录
	Stdin        io.Reader            // 标准输入,如果未指定的话就选择系统空设备,该参数也可以指定一个文件
	Stdout       io.Writer            // 标准输出,如果未指定的话就选择系统空设备,该参数也可以指定一个文件
	Stderr       io.Writer            // 标准错误输出,如果未指定的话就选择系统空设备,该参数也可以指定一个文件
	ExtraFiles   []*os.File           // 程序要打开的其它文档
	SysProcAttr  *syscall.SysProcAttr // 可选的特定操作系统的属性
	Process      *os.Process          // 程序进程
	ProcessState *os.ProcessState     // 程序进程状态
	Err          error                // 
	Cancel       func() error         // 
	WaitDelay    time.Duration        // 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

总结

Golang执行执行外部程序与Shell命令还是比较方便的,实际使用中更多的需要注意阻塞方法以及持续执行的外部程序的处理。

可以借助 github.com/creack/pty 来实现虚拟终端交互功能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/633873
推荐阅读
相关标签
  

闽ICP备14008679号