一般情况下,在 golang 中执行一些命令如 git clone,则可以使用 exec.Command 函数

func RunCommand(path, name string, arg ...string) (msg string, err error) {cmd := exec.Command(name, arg...)cmd.Dir = patherr = 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.Buffervar stderr bytes.Buffercmd.Stdout = &outcmd.Stderr = &stderrcmd.Dir = patherr = 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 existcmd [/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 这个原因。

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

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

golang 执行命令行相关推荐

  1. 在LoadRunner向远程Linux/Unix执行命令行并收集性能数据

    前面介绍过在LoadRunner的Java协议实现"使用SSH连接Linux",当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对"在LoadRunne ...

  2. 命令逐行显示_在LoadRunner中执行命令行程序之:popen()取代system()

    >>>推荐阅读<<< 1.性能测试学习笔记-场景设计 2.性能测试的重要意义 3.性能分析流程及方法 4.应用系统性能调优之性能分析 在LoadRunner中执行命 ...

  3. python基础之os.system函数执行命令行语句

    前言 os.system方法是os模块最基础的方法,其它的方法一般在该方法基础上封装完成. os的system原理 system函数可以将字符串转化成命令在服务器上运行:其原理是每一条system函数 ...

  4. runtime java_Java runtime.getruntime()从执行命令行程序获得输出

    Java runtime.getruntime()从执行命令行程序获得输出 我正在使用运行时从我的Java程序运行命令提示符命令.但是,我不知道如何获得命令返回的输出. 这是我的代码:Runtime  ...

  5. 执行命令行并等待完成

    function TDMDb.WaitExeFinish(const sCmdName: string):boolean; var StartupInfo: TStartupInfo; Process ...

  6. golang同时使用命令行参数和配置文件

    面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>>    golang同时使用命令行参数和配置文件 [toc] 之前使用过spring-boot框架,在配置参数传递上可以 ...

  7. golang 运行命令行进行图片格式转换(jpg转png)

    1.golang 运行命令行 cmd := exec.Command(命令, 传入参数1, 传入参数2,...) cmd.Stdout = os.Stdout if err := cmd.Run(); ...

  8. [笔记]Windows核心编程《番外篇》几种常见的执行命令行方法

    文章目录 前言 WinExec 作用 实例 CreateProcess 作用 实例 System popen ShellExecute ShellExecute ShellExecuteEx 区别比较 ...

  9. Mac OS开机启动自动执行命令行

    Mac OS开机启动自动执行命令行 公司的打包服务器升级需要频繁重启,或者物业断电而必须关机时,下次开机都需要手动启动一些服务,这样就显得非常麻烦,故需要进行配置使得Mac开机后自动启动服务. 首先编 ...

最新文章

  1. OpenCV中resize函数五种插值算法的实现过程
  2. Oracle Advanced Security:Column Encryption Overhead
  3. TestBird频现国内手游“盛宴” 开发商互相介绍用得很赞
  4. 【错误记录】Oboe / AAudio 播放器报错 ( onEventFromServer - AAUDIO_SERVICE_EVENT_DISCONNECTED - FIFO cleared )
  5. Arduino产生PWM的3种方法
  6. 2.11 总结-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  7. command对象的ExecuteScalar方法
  8. HTML+CSS页面练习——legend第九部分
  9. 虚拟机 ubuntu10.04 安装 Mercury MW150U 无线网卡(AR9271芯片组)
  10. jdbc显示mysql的数据_JDBC链接mysql插入数据后显示问号的原因及解决办法
  11. 序列化:protobuf原理
  12. 直播视频网站源码,延迟的几种方式
  13. 全国、省、地级市、区县乡镇级矢量地图2021年(最新)
  14. Java精品源码第83期在线旅游网站系统(推荐)
  15. 【历史上的今天】1 月 5 日:正则表达式的发明人出生;英特尔发布酷睿系列;Microsoft Bob 诞生
  16. Pytorch机器学习(六)——YOLOV5中的自适应图片缩放letterbox
  17. C++基础学习-33模板全特化、偏特化(局部特化)
  18. ehvierwer登录与不登录_【更新】亿寻—免登录不限速下载百度网盘
  19. GoogleHacking
  20. Crazy Engine 3.0(又名盘古引擎)的技术特性

热门文章

  1. 用python分析小说_用Python分析《斗破苍穹》
  2. linux驱动之总线详解
  3. Mysql-事务篇(1)
  4. java画二维坐标_在图形界面中绘制二维的坐标系统
  5. linux内核模块编程(六)----字符设备驱动中断开发
  6. 数据结构(十九) -- C语言版 -- 树 - 树、森林、二叉树的江湖爱恨情仇、相互转换
  7. [week3]每周总结与工作计划
  8. 服务器占用cpu启动就死机,CPU使用率高会不会造成死机?为何?
  9. JavaWeb和JavaScript的学习
  10. host, origin, referrer的区别