首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 语言中执行外部命令的方法

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

作者头像
赵云龙龙
发布2022-03-29 17:24:33
1.4K0
发布2022-03-29 17:24:33
举报
文章被收录于专栏:python爱好部落python爱好部落

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")
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python粉丝团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 仅执行命令
  • 2. 获取结果
    • 2.1. 不区分 stdout 和 stderr
    相关产品与服务
    命令行工具
    腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档