golang 执行命令行的实现

一般情况下,在 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("err", err.Error(), "cmd", cmd.Args)
    }
    return
}

这种写法是没有问题,但是一旦执行出错返回值过于简洁了,比如

func main() {
    msg, err := common.RunCommand("./", "/bin/bash", "-c", "git clone url")
    if err != nil {
        log.Fatal(err)
        return
    }
    log.Println(msg)
}

执行后,返回 exit status 128 这种提示,太抽象了,还得专门去搜索引擎查看,若是想要看出更详细的原因还需如此

func RunCommand(path, name string, arg ...string) (msg string, err error) {
    cmd := exec.Command(name, arg...)
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    cmd.Dir = path
    err = cmd.Run()
    log.Println(cmd.Args)
    if err != nil {
        msg = fmt.Sprint(err) + ": " + stderr.String()
        err = errors.New(msg)
        log.Println("err", err.Error(), "cmd", cmd.Args)
    }
    log.Println(out.String())
    return
}

再次执行,返回

2022/04/03 20:33:49 [/bin/bash -c git clone url]
2022/04/03 20:33:49 err exit status 128: fatal: repository 'url' does not exist
 cmd [/bin/bash -c git clone url]
2022/04/03 20:33:49 
2022/04/03 20:33:49 exit status 128: fatal: repository 'url' does not exist

哦,原来是 repository 'url' does not exist 这个原因。

更进一步说下,为啥加了 Stdout 和 Stderr 就能接到值了呢,这是由于有些命令会把错误信息打到 Stdout,而也有些命令会把错误信息打到 Stderr,所以就得把两个都收着。

参考:How to debug “exit status 1” error when running exec.Command in Golang

到此这篇关于golang 执行命令行的实现的文章就介绍到这了,更多相关golang 执行命令行内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Golang中基础的命令行模块urfave/cli的用法说明

    前言 相信只要部署过线上服务,都知道启动参数一定是必不可少的,当你在不同的网络.硬件.软件环境下去启动一个服务的时候,总会有一些启动参数是不确定的,这时候就需要通过命令行模块去解析这些参数,urfave/cli是Golang中一个简单实用的命令行工具. 安装 通过 go get github.com/urfave/cli 命令即可完成安装. 正文 使用了urfave/cli之后,你的程序就会变成一个命令行程序,以下就是通过urfave/cli创建的一个最简单的命令行程序,它设定了一些基础的信息,

  • Golang命令行进行debug调试操作

    GoLang调试工具Delve 1.先获取呗: go get -u github.com/derekparker/delve/cmd/dlv 2.编写测试代码呗: func main(){ http.HandleFunc("/test",func(writer http.ResponseWriter,req *http.Request){ //TODO }) log.Fatal(http.ListenAndServe("127.0.0.1:8080",nil)) }

  • golang实现命令行程序的使用帮助功能

    通过flag包我们可以很方便的实现命令行程序的参数标志,接下来我们来看看如何实现命令行程序的使用帮助,通常以参数标志-h或--help的形式来使用. 自动生成使用帮助 我们只需要声明其他参数标志,并执行解析,flag包会帮我们自动生成使用帮助. //main.go //输出2个数,输出较大的数 package main import ( "flag" "fmt" "math" ) func main() { firstFlag := flag.F

  • Golang开发命令行之flag包的使用方法

    目录 1.命令行工具概述 2.flag包介绍 3.flag包命令行参数的定义 4.flag包命令行参数解析 5.flag包命令行帮助 6.flag定义短参数和长参数 7.示例 1.命令行工具概述 日常命令行操作,相对应的众多命令行工具是提高生产力的必备工具,鼠标能够让用户更容易上手,降低用户学习成本. 而对于开发者,键盘操作模式能显著提升生产力,还有在一些专业工具中, 大量使用快捷键代替繁琐的鼠标操作,能够使开发人员更加专注于工作,提高效率,因为键盘操作模式更容易产生肌肉记忆 举个栗子:我司业务

  • golang中命令行库cobra的使用方法示例

    简介 Cobra既是一个用来创建强大的现代CLI命令行的golang库,也是一个生成程序应用和命令行文件的程序.下面是Cobra使用的一个演示: Cobra提供的功能 简易的子命令行模式,如 app server, app fetch等等 完全兼容posix命令行模式 嵌套子命令subcommand 支持全局,局部,串联flags 使用Cobra很容易的生成应用程序和命令,使用cobra create appname和cobra add cmdname 如果命令输入错误,将提供智能建议,如 ap

  • golang 执行命令行的实现

    一般情况下,在 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("er

  • golang执行命令获取执行结果状态(推荐)

    这几天在用golang写一个工具,要执行外部命令工具,而且还要将外部命令工具输出的日志也要输出出来.网上找了一下,资料很多,关键是执行的结果成功或失败状态没找到好的方法获取到. 刚开始想的是看错误日志,如果有错误日志,那么就是执行失败.测试的时候发现这样不行,发现有些时候会用error输出日志,但不一定就是执行失败.后来想用日志中的关键字匹配,因为有些命令执行成功或失败都是有关键字输出的,测试发现也不太好. 最后没办法,看了一下Cmd.Wait()方法的实现,突然眼前一亮,找到方法了,有一个Cm

  • golang执行命令操作 exec.Command

    我就废话不多说了,大家还是直接看代码吧~ cmd := exec.Command("cmd") in := bytes.NewBuffer(nil) cmd.Stdin = in//绑定输入 var out bytes.Buffer cmd.Stdout = &out //绑定输出 go func() { in.WriteString("node E:/design/test.js\n")//写入你的命令,可以有多行,"\n"表示回车 }

  • Golang执行cmd命令行的方法

    1. Golang执行系统命令使用 os/exec Command方法: func Command(name string, arg ...string) *Cmd 第一个参数是命令名称,后面参数可以有多个命令参数. cmd := exec.Command("ls", "-a") if stdout, err := cmd.StdoutPipe(); err != nil {     //获取输出对象,可以从该对象中读取输出结果     log.Fatal(err)

  • Python 命令行参数sys.argv

    Python代码: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->import os, sysos.system(sys.argv[1])带参数执行 python xxx.py speos.system 是用来执行命令行的.因此该程序会接收到第一个参数spe,然后在命令行里执行spe,这样,spe(Python IDE)就打开了.

  • PowerShell入门教程之PowerShell和Cmd命令行的关系?

    PowerShell是命令行的加强版吗?PowerShell能执行命令行的所有命令吗?PowerShell要替代命令行?这三个问题的答案足以让我们了解PowerShell与Cmd命令行之间的关系.让我们慢慢道来... PowerShell中的CMD命令 启动PowerShell,在其中输入几个常用的Cmd命令 复制代码 代码如下: PS D:\Projects\Practise\PowerShell> dir     Directory: D:\Projects\Practise\PowerSh

随机推荐