日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

go語言中執行命令的幾種方式

 

Go語言用來執行一個系統的命令相對Python來說還是有點復雜的,執行命令是一個非常常見的需求,如調用一個系統命令,啟一個exe等,這里分為幾種情況,之后統一總結一下。

  • 只執行命令,不要輸出結果
  • 執行命令并且要獲取到輸出結果
  • 阻塞和異步的執行

以下以ping www.baidu.com 為例依次執行一下各種命令,主要使用標準庫中的os/exec

在執行命令的時候,我們主要使用的是os/exec包主的Cmd結構體方法,Cmd的結構體定義如下 Cmd結構體定義[1]

主要的參數有

Path string
// Args保管命令的參數,包括命令名作為第一個參數;如果為空切片或者nil,相當于無參數命令。
//
// 典型用法下,Path和Args都應被Command函數設定。
Args []string
// Env指定進程的環境,如為nil,則是在當前進程的環境下執行。
Stdin io.Reader
// Stdout和Stderr指定進程的標準輸出和標準錯誤輸出。
//
// 如果任一個為nil,Run方法會將對應的文件描述符關聯到空設備(os.DevNull)
//
// 如果兩個字段相同,同一時間最多有一個線程可以寫入。
Stdout io.Writer
Stderr io.Writer

但是我們一般不直接構造Cmd結構體,而是通過exec.Command() 函數返回一個Cmd結構體指針 如 exec.Command("ping","www.baidu.com") ping為命令,"www.baidu.com" 為參數,在得到*Cmd以后再使用結構體方法Run,Start等方法來真正的執行命令。

只執行命令,不要輸出結果這里的輸出結果只是表明命令執行了,但是它具體的輸出我們不關心,在這種其實用的挺多的,我們只是想執行命令,在python里我們可以使用os.system() 函數來執行,當然這個是阻塞的執行

>>> import os
>>> r = os.system("ping www.baidu.com")
正在 Ping www.a.shifen.com [39.156.66.18] 具有 32 字節的數據:
來自 39.156.66.18 的回復: 字節=32 時間=6ms TTL=54
來自 39.156.66.18 的回復: 字節=32 時間=28ms TTL=54
來自 39.156.66.18 的回復: 字節=32 時間=6ms TTL=54
來自 39.156.66.18 的回復: 字節=32 時間=7ms TTL=54
39.156.66.18 的 Ping 統計信息:
 數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
 最短 = 6ms,最長 = 28ms,平均 = 11ms
>>> r
0

這里的r只是獲取了該命令的執行結果,是0表示沒有錯誤,但是執行命令的輸出如 正在 Ping www.a.shifen.com..... 我們并不關心

執行命令可以使用Run() 或者Start() 方法,Run是阻塞的執行,Start() 是非阻塞的執行。

go語言中執行命令的幾種方式

 

程序什么也沒有輸出,但是停頓的一段時間后才退出。如果換成command.Start() 則程序運行起來以后馬上就停止了。

如果想要獲取到像python 那種 os.system的執行結果,其實這里的結果應該是ExitError,程序的退出碼,應該怎么操作呢?這里exec包里有一個專門的結構體ExitError,使用它的一些方法可以獲取到ExitCode,但是想要獲取到ExitCode得到得到命令結束,也就是要阻塞的運行,上面使用Run() 方法可以阻塞等待執行結果,使用Start()方法以后,也可以使用Wait()方法來等待執行結束。

go語言中執行命令的幾種方式

 

通過

command.ProcessState.Sys().(syscall.WaitStatus).ExitCode

來獲取到命令執行的退出碼

執行命令并且要獲取到輸出結果這里的輸出結果是命令行的標準輸出或者錯誤輸出,也就是stdout或者stderr,通過bytes.Buffer來存儲

go語言中執行命令的幾種方式

 

這里得到的中文輸出有亂碼

go語言中執行命令的幾種方式

 

這個我查了一下一般都是說是設置一下控制臺輸出chcp或者使用

golang.org/x/text/encoding/simplifiedchinese 

這個包進行轉換,我不想使用,這個以后找到方法再說吧。

命令行的輸入有時候進入命令行會等待用戶的交互,如輸入nslookup

go語言中執行命令的幾種方式

 

執行不在環境變量里的命令像上面這個ping 命令,由于在windows 或者linux中,這個命令是在環境變量里,但是像windows中的copy 命令,它是不在環境變量里,正常情況下你可以在cmd中使用copy 命令,但是如果在go 語言中如果直接像上面那樣使用是不行的。 例如使用上面的代碼,替換一下copy 命令

go語言中執行命令的幾種方式

 

得到的輸出結果為

run error :exec: "copy": executable file not found in %PATH%

應該使用cmd", "/C" copy命令

go語言中執行命令的幾種方式

 

參考資料

[1]

Cmd結構體定義: https://studygolang.com/static/pkgdoc/pkg/os_exec.htm#Cmd

[2]

golang exec 命令執行: https://www.jianshu.com/p/9787e30552ce

[3]

Windows下,在CMD下執行Go出現中文亂碼的解決方法: https://blog.csdn.net/rznice/article/details/88122923

分享到:
標簽:語言
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定