成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[275072]]

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

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

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

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

主要的參數有

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

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

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

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

這里的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語言中執行命令的幾種方式

通過

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

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

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

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

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

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

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

  1. golang.org/x/text/encoding/simplifiedchinese  

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

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

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

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

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

得到的輸出結果為:

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

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

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

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2009-11-23 11:25:54

php curl

2022-11-03 20:38:01

CMD命令Go

2023-12-21 07:09:32

Go語言任務

2020-08-12 08:51:19

Go語言Concurrency后臺

2024-04-07 11:33:02

Go逃逸分析

2021-07-15 23:18:48

Go語言并發

2023-11-30 08:09:02

Go語言

2022-07-19 12:25:29

Go

2021-06-08 07:45:44

Go語言優化

2023-07-29 15:03:29

2023-01-12 08:52:50

GoroutinesGo語言

2021-04-28 09:02:48

Golang語言Context

2023-12-30 18:35:37

Go識別應用程序

2025-03-27 00:45:00

2024-01-08 07:02:48

數據設計模式

2021-07-13 06:44:04

Go語言數組

2023-11-21 15:46:13

Go內存泄漏

2009-12-29 14:36:29

Ubuntu cron

2012-06-15 09:56:40

2023-12-25 09:58:25

sync包Go編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品久久 | 成人欧美一区二区三区在线观看 | 成人在线视频观看 | 国产91丝袜在线播放 | 97国产一区二区精品久久呦 | 亚洲欧美日韩在线一区二区 | 久久综合九色综合欧美狠狠 | 亚洲国产精品成人无久久精品 | 不卡一区 | 亚洲国产精品一区二区第一页 | 国产免费观看久久黄av片涩av | 色男人天堂av | 日韩一区中文字幕 | 国产成人99久久亚洲综合精品 | 久草网站| 日本a v在线播放 | 五月天婷婷久久 | 国产高清视频在线观看 | 成人片免费看 | 福利视频二区 | 中文字幕欧美一区 | 精品综合网 | 成人影院在线视频 | 国产日韩视频在线 | 日本电影韩国电影免费观看 | 理伦毛片| 国产三级精品视频 | 亚洲网址 | 久久久国产精品 | 蜜臀久久99精品久久久久野外 | 日韩国产欧美一区 | 欧美视频免费在线 | 色婷婷精品久久二区二区蜜臂av | 韩国久久| 欧美精品1区 | 日韩在线免费视频 | 青青草网 | 蜜桃一区二区三区 | 天天艹天天干天天 | 亚洲精品免费视频 | 久久久精品视 |