golang 執(zhí)行命令行的實(shí)現(xiàn)
一般情況下,在 golang 中執(zhí)行一些命令如 git clone,則可以使用 exec.Command 函數(shù)
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
}
這種寫法是沒有問題,但是一旦執(zhí)行出錯(cuò)返回值過于簡潔了,比如
func main() {
msg, err := common.RunCommand("./", "/bin/bash", "-c", "git clone url")
if err != nil {
log.Fatal(err)
return
}
log.Println(msg)
}
執(zhí)行后,返回 exit status 128 這種提示,太抽象了,還得專門去搜索引擎查看,若是想要看出更詳細(xì)的原因還需如此
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
}
再次執(zhí)行,返回
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 這個(gè)原因。
更進(jìn)一步說下,為啥加了 Stdout 和 Stderr 就能接到值了呢,這是由于有些命令會(huì)把錯(cuò)誤信息打到 Stdout,而也有些命令會(huì)把錯(cuò)誤信息打到 Stderr,所以就得把兩個(gè)都收著。
參考:How to debug “exit status 1” error when running exec.Command in Golang
到此這篇關(guān)于golang 執(zhí)行命令行的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang 執(zhí)行命令行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言開發(fā)kube-scheduler整體架構(gòu)深度剖析
這篇文章主要為大家介紹了Go語言開發(fā)kube-scheduler整體架構(gòu)深度剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Go中的Context實(shí)現(xiàn)原理以及正確使用方式
在 Go 語言中,Context 包是一種非常常用的工具,它被用來管理 goroutine 之間的通信和取消,本文將深入探討Context 包的基本原理,包括使用場(chǎng)景、原理和一些最佳實(shí)踐,感興趣的小伙伴跟著小編一起來看看吧2024-11-11
golang動(dòng)態(tài)庫(so)生成與使用方法教程
這篇文章主要給大家介紹了關(guān)于golang動(dòng)態(tài)庫(so)生成與使用的相關(guān)資料,我們平時(shí)使用的動(dòng)態(tài)庫都是由c/c++開發(fā)最后生成的.so文件,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
Go語言驅(qū)動(dòng)低代碼應(yīng)用引擎工具Yao開發(fā)管理系統(tǒng)
這篇文章主要為大家介紹了Go語言驅(qū)動(dòng)低代碼應(yīng)用引擎工具Yao開發(fā)管理系統(tǒng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

