美文网首页
Go 语言中执行外部命令的方法

Go 语言中执行外部命令的方法

作者: 小安静子 | 来源:发表于2022-03-21 12:51 被阅读0次

Go 语言中执行外部命令主要的方法是使用包 os/exec

此包的详细文档见 exec package - os/exec - pkg.go.dev,这里只介绍几种常用操作。


执行命令也分几种情况:

  1. 仅执行命令;
  2. 执行命令,获取结果,不区分 stdout 和 stderr;
  3. 执行命令,获取结果,区分 stdout 和 stderr。

另外,默认的命令执行是在 go 进程当前的目录下执行的,我们可能还需要指定命令执行目录。

下面我们逐个说。

1. 仅执行命令

执行命令,首先要拼接一下命令和参数,然后运行命令。

  • 拼接命令与参数使用 exec.Command(),其会返回一个 *Cmd
func Command(name string, arg ...string) *Cmd

执行命令使用 *Cmd 中的 Run() 方法,Run() 返回的只有 error。

func (c *Cmd) Run() error

我们直接看代码:

package main

import (
    "log"
    "os/exec"
)

func ExecCommand(name string, args ...string) {
    cmd := exec.Command(name, args...) // 拼接参数与命令
    if err := cmd.Run(); err != nil {  // 执行命令,若命令出错则打印错误到 stderr
        log.Println(err)
    }
}

func main() {
    ExecCommand("ls", "-l")
}

执行代码,没有任何输出。

上面的代码中,我们执行了命令 ls -l,但是没有得到任何东西。

2. 获取结果

2.1. 不区分 stdout 和 stderr

要组合 stdout 和 stderr 输出,,Cmd 中有方法:

func (c *Cmd) CombinedOutput() ([]byte, error)

用这个方法来执行命令(即这个方法是已有 Run() 方法的作用的,无需再执行 Run())。

我们修改上述代码

package main

import (
    "fmt"
    "log"
    "os/exec"
)

func ExecCommand(name string, args ...string) {
    cmd := exec.Command(name, args...) // 拼接参数与命令

    var output []byte
    var err error

    if output, err = cmd.CombinedOutput(); err != nil {
        log.Println(err)
    }
    fmt.Print(string(output)) // output 是 []byte 类型,这里最好转换成 string
}

func main() {
    ExecCommand("ls", "-l")
}

我们得到了 ls -l 这条命令的输出.

2.2. 区分 stdout 和 stderr
区分 stdout 和 stderr,要先给 cmd 中的成员指定一个输出 buffer,然后执行 Run() 就可以。

package main

import (
    "bytes"
    "fmt"
    "log"
    "os/exec"
)

func ExecCommand(name string, args ...string) {
    cmd := exec.Command(name, args...) // 拼接参数与命令

    var stdout bytes.Buffer
    var stderr bytes.Buffer
    var err error

    cmd.Stdout = &stdout
    cmd.Stderr = &stderr

    if err = cmd.Run(); err != nil {
        log.Println(err)
    }
  
    fmt.Print(stdout.String())
    fmt.Print(stderr.String())
}

func main() {
    ExecCommand("ls", "-l")
}

相关文章

  • Go 语言中执行外部命令的方法

    Go 语言中执行外部命令主要的方法是使用包 os/exec。 此包的详细文档见 exec package - os...

  • Go语言中重写String()方法

    Go语言中的String方法 在go中如果重写了String 方法,那在调用fmt.Println时就会自动去执行...

  • Go语言指针

    Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。 接下来让我们来一步步学习 Go 语...

  • go语言中的方法

    go支持OO语言的一些特性,方法就是其中之一。本文将介绍go语言中方法相关的概念。 方法声明 在go语言中,我们可...

  • TODO:Go语言goroutine和channel使用

    TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语...

  • bash的if语句用法之:判断外部命令结果

    如何在if语句条件表达式里面调用外部命令(函数,或者外部脚本),然后根据外部命令的执行结果确定走什么分支。 基本语...

  • #Python#执行外部命令cmd/shell

    工作中出于对一个脚本的优化,需要使用Python执行外部命令。这篇文章也算是工作的简单总结。执行外部命令有多种方法...

  • 2021-03-04 - 2

    执行方法1 go build 执行代码的路径 例如 :go build /Users/apple/go/src/g...

  • 14-Go方法和接口-指趣学院

    方法 Go语言中的方法其实就是一个特殊函数, 只不过这个函数是和某种属性类型绑定在一起的而已 Go语言中的方法一般...

  • Go语言实战笔记(二)| Go开发工具

    在Go语言中,我们很多操作都是通过go命令进行的,比如我们要执行go文件的编译,就需要使用go build命令,除...

网友评论

      本文标题:Go 语言中执行外部命令的方法

      本文链接:https://www.haomeiwen.com/subject/guiwdrtx.html