golang 执行命令行-程序员宅基地

技术标签: golang  Go  

一般情况下,在 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 这个原因。

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/molaifeng/article/details/123943715

智能推荐

awk技巧-!a[$0]++_linux awk '!a[$0]++{print $0}-程序员宅基地

文章浏览阅读2.5k次。转载自:http://www.51testing.com/html/87/363787-811057.html解释下awk '!a[$0]++' file一看之下,首先是想到又用到awk的hash,又是缺省的pattern,一下子来了兴趣,做了以下的分析这个要从awk的执行模式开始说,最后结合++运算符,和hash特色有三个基本知识点是要了解的1:a++的作用是先附值,_linux awk '!a[$0]++{print $0}

Linux查看动态链接库的所有函数以及在动态链接库查找某一个函数的方法_如何测试一个动态库是否含有某个函数-程序员宅基地

文章浏览阅读1.7w次。查看动态链接库的所有函数:假设要查看的动态链接库为yourLib.so,则如下nm yourLib.so在动态链接库中查找某一个函数是否存在以及函数入口地址:假设动态链接库为yourLib.so,函数名字为yourFunction,则如下:nm -D yourLib.so |grep -w yourFunction_如何测试一个动态库是否含有某个函数

在 QEMU 上运行 RISC-V 32 位版本的 Linux_qemu 32位riscv-程序员宅基地

文章浏览阅读1.8k次。前言最近中科院软件所PLCT实验室要开始基于 OpenJDK11 进行 RISC-V 32G 的移植工作,需要搭建好 RISC-V 32 位的 Linux 环境,本文就是介绍 RISC-V 32 位 Yocto版本的 Linux 环境的搭建过程。1. 环境准备1.1 宿主机本次部署基于 Ubuntu 18.04.5 LTS 进行操作。$ lsb_release aUsage: lsb_release [options]lsb_release: error: No arguments are _qemu 32位riscv

Win10共享文件提示与管理员请求访问权限的解决方法_请与网络管理员联系请求访问权限win10-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏13次。声明为了省事,图片直接从系统之家网站取用的。原地址为:http://www.xitongzu.com/jc/27789.html问题概述在Win10系统上共享文件,对于我们来说,都不会陌生,因为大家或多或少都有接触过,而有用户在Win10系统上共享文件的时候,碰到“没有权限访问文件夹。请与网络管理员联系请求访问权限”的提示,然后共享失败,接下来为大家提供解决办法。解决办法在共享的..._请与网络管理员联系请求访问权限win10

经典幽默的计算机名人名言_what is programming language (名人名言)-程序员宅基地

文章浏览阅读8.1k次。经典幽默的计算机名人名言 “人们总是害怕改变。电被发明出来的时候他们害怕电,是不是?他们害怕煤,害怕蒸汽机车。无知无所不在,并导致恐惧。但随着时间推移,人们终究会接受最新的科技。”正如比尔盖茨曾经警告过一样,计算机已经真正成为我们的最新科技,几乎遍布我们日常生活的每一方面。所以,我们这个时代的某些最伟大的头脑开始思索起计算机和软件对于人类的重要性来了。以下就是101条有关计算机的伟大名言,_what is programming language (名人名言)

数据库连接池、长连接、短连接的理解-程序员宅基地

文章浏览阅读7.7k次。TCP连接:节点与节点之间的TCP连接是要经过3次握手才能进行数据通信的。TCP连接3次握手:参考:[url]http://www.jellythink.com/archives/705[/url]长连接:TCO建军立之后就是长连接了,只要你不断开可以一直进行数据的伟输。长连接适用于要进行大量数据传输的情况,如:数据库,redis,memcached等要求快速,数据量大的情况下..._数据库连接池是长连接还是短连接

随便推点

ubuntu安装mysql可视化工具MySQL-workbench及简单操作_ubantu mysql 可视化-程序员宅基地

文章浏览阅读4.4w次,点赞14次,收藏42次。本文简单介绍了mysql的可视化工具mysql workbench的安装及简单操作_ubantu mysql 可视化

MapReduce程序依赖的jar包_mapreduce的依赖-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏8次。难得想写个mapreduce程序,发现已经不记得需要添加那些jar包了,网上找了一会也没发现准确的答案。幸好对hadoop体系结构略知一二,迅速试出了写mapreduce程序需要的三个jar包。 不多不少,3个包足矣……贴出来免得其朋友再走弯路 (请忽视包的版本不一致问题,是我从其他项目中东拼西凑过来的)_mapreduce的依赖

hdu 1052 田忌赛马加强-程序员宅基地

文章浏览阅读684次。背景:由于前些天做了贪心的题目就准备刷点贪心看看,不过

Android进程间通信的几种方式_android系统中进程间的通讯方式-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏28次。定义多进程Android应用中使用多进程只有一个办法(用NDK的fork来做除外),就是在AndroidManifest.xml中声明组件时,用android:process属性来指定。不知定process属性,则默认运行在主进程中,主进程名字为包名。android:process = package:remote,将运行在package:remote进程中,属于全局进程,其他具有相同..._android系统中进程间的通讯方式

OpenCV3.4.1在Windows系统+Python3.5.x上的安装与使用_opencv 3.4.1+python-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏14次。一、Python3.5.x的下载与安装 1. 在Python官网上下载,根据自己需要选择版本下载即可 2. 安装:在安装的时候选择记得勾选 Add python3.5.x to Path(忘记勾选也没关系,安装好之后找度娘问一下就好了,教程也很多); 还有是建议选择Customize(自定义),进来自定义界面后记得勾选pip等一系列的东西,修改路径为C:\Python..._opencv 3.4.1+python

机器学习与数据挖掘网上资源搜罗-程序员宅基地

文章浏览阅读291次。转自:http://blog.csdn.net/baimafujinji/article/details/50467970前面我曾经发帖推荐过网上的一些做“图像处理和计算机视觉的”有料博客资源,原帖地址图像处理与机器视觉网络资源收罗——倾心大放送http://blog.csdn.net/baimafujinji/article/details/32332079