• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
Naisu Xu
帮助1

目的

程序中执行外部程序是比较常用的功能,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        // 
}
学新通

总结

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

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfiahei
系列文章
更多 icon
同类精品
更多 icon
继续加载