原文链接:
https://xiets.blog.csdn.net/article/details/130866872
版权声明:原创文章禁止转载
专栏目录:
Golang 专栏(总目录)
Go 内置的
os/exec
包用于运行外部命令。它包装了
os.StartProcess
以便更轻松地重新映射 标准输入 和 标准输出、将 I/O 与 管道 连接以及进行其他调整。
exec
包的常用函数:
func LookPath(file string) (string, error)
func Command(name string, arg ...string) *Cmd
func CommandContext(ctx context.Context, name string, arg ...string) *Cmd
exec.Cmd
类型和方法:
type Cmd struct {
Path string
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
func (c *Cmd) CombinedOutput() ([]byte, error)
func (c *Cmd) Output() ([]byte, error)
func (c *Cmd) Start() error
func (c *Cmd) Wait() error
func (c *Cmd) Run() error
func (c *Cmd) StdinPipe() (io.WriteCloser, error)
func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
func (c *Cmd) StderrPipe() (io.ReadCloser, error)
func (c *Cmd) String() string
exec
运行外部命令,代码示例:
package main
import (
"bytes"
"fmt"
"os/exec"
"strings"
func main() {
RunDemo1()
RunDemo2()
RunDemo3()
RunDemo4()
RunDemo5()
func RunDemo1() {
fmt.Println("\nRunDemo1()")
cmd := exec.Command("go", "version")
fmt.Println(cmd.Path)
fmt.Println(cmd.Args)
fmt.Println(cmd.String())
out, _ := cmd.Output()
fmt.Println(string(out))
fmt.Println(cmd.ProcessState.ExitCode())
fmt.Println(cmd.ProcessState.Pid())
fmt.Println(cmd.ProcessState.String())
func RunDemo2() {
fmt.Println("\nRunDemo2()")
cmd := exec.Command("go", "version")
out := bytes.NewBuffer(nil)
cmd.Stdout = out
_ = cmd.Start()
_ = cmd.Wait()
fmt.Println(out.String())
func RunDemo3() {
fmt.Println("\nRunDemo3()")
cmd := exec.Command("tr", "a-z", "A-Z")
in := strings.NewReader("hello world")
cmd.Stdin = in
out := bytes.NewBuffer(nil)
cmd.Stdout = out
_ = cmd.Run()
fmt.Println(out.String())
func RunDemo4() {
fmt.Println("\nRunDemo4()")
cmd := exec.Command("pwd")
dir, _ := os.UserHomeDir()
cmd.Dir = dir
out, _ := cmd.CombinedOutput()
fmt.Printf("%s\n", out)
func RunDemo5() {
fmt.Println("\nRunDemo5()")
cmd := exec.Command("env")
env := os.Environ()
env = append(env, "hello=world")
env = append(env, "aa=bb")
cmd.Env = env
pr, _ := cmd.StdoutPipe()
ch := make(chan bool)
go func() {
out, _ := io.ReadAll(pr)
fmt.Printf("ENV:\n%s\n", out)
ch <- true
}()
_ = cmd.Run()
golang调用外部命令,并且通过stdin传数据的例子使用场景:当我们需要调用一个外部命令,然后给外部命令传参数,常用方便的做法是通过命令行传参数,但是有些时候数据太长,或者基于安全考虑,比如传密码,等不方便使用参数时,我们可以通过stdin传递。下面一个docker login传递密码的例子:func dockerLogin(registry string, username string, ...
1. 概述
golang 下的 os/exec 包执行外部命令包执行外部命令。它包装了 os.StartProcess 函数以便更容易的修正输入和输出,使用管道连接I/O,以及作其它的一些调整。
与 C 语言或者其他语言中的“系统”库调用不同, os/exec 包并不调用系统 shell ,也不展开任何 glob (正则匹配)模式,也不处理通常由 shell 完成的其他扩展、管道或重定向。
2. 相关函数
2.1 Variables
var ErrNotFound = errors.New("executa
一般情况下,在 golang 中执行一些命令如 git clone,则可以使用 exec.Command 函数
func RunCommand(path, name string, arg ...string) (msg string, err error) {
cmd := exec.Command(name, arg...)
cmd.Dir = path
err = cmd.Run()
log.Println(cmd.Args)
if err != nil {
log.Println("e
go 是管理 Go 代码的工具,但不仅仅用于编译 Go 代码。下载并安装指定的包及其依赖。go get 干了三件事:一是更新 go.mod 文件将指定包及其版本加入其中;二是下载包源码至模块缓存();三是安装包,生成二进制程序至GOPATH/bin(从 Go 1.17 版本开始,为了更加符合其语义,该功能被废弃,改用go install)。如果包中不包含可执行文件,则不会执行第三步,即 go get 操作成功后 GOPATH/bin 目录下不会有任何编译好的二进制文件。
func Exec(argv0 string, argv []string, envv []string) (err error)
Exec invokes the execve(2) system call.
此方法会将在当前进程空间里,用新的程序覆盖掉当前程序,并执行新的程序,它们依然在同一个进程里,只是进程的内容发生了变化。
main11.go
package main
import (
"fmt"
"syscall"
func mai
本文介绍了使用 os/exec 这个标准库调用外部命令的各种姿势。同时为了便于使用, 我编写了一个 goexec 包封装对 os/exec 的调用。这个包目前 for 我自己使用是没有问题的, 大家有其他需求可以提 issue 或者自己魔改😄。大家如果发现好玩、好用的 Go 语言库, 欢迎到 Go 每日一库 GitHub 上提交 issue😄。
程序中执行外部程序是比较常用的功能,Golang执行外部程序可以使用标准库中的 `os/exec` [https://pkg.go.dev/os/exec](https://pkg.go.dev/os/exec) 。这个包默认是用来执行外部程序的,可以通过调用Shell程序来执行Shell命令。这篇文章将对相关使用做个记录,方便自己查阅。
执行单个命令 ls -l ,exec.Command很容易执行,但是需要执行ls -l|wc -l 这样的命令要怎么编写
golang中,需要执行两个命令ls -l 和 wc -l 但是这两个命令是有关系的,只要定义好两个命令的输入输出,就可以完成.
1. 定义两个命令行:
var commands []*exec.Cmd
1、命令源码文件:
声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。
命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,就会安装到 GOBIN 指向的目录下。
命令源码文件是 Go 程序的入口。