赞
踩
程序中执行外部程序是比较常用的功能,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
函数来提前终止程序进程:
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 来实现虚拟终端交互功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。