




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Go語言入門exec的基本使用示例目錄使用GoLangexec包運(yùn)行命令為不同的操作系統(tǒng)指定命令Goexec命令捕獲輸出Gocmd.StdinPipeGocmd.StdoutPipe總結(jié)Exec是os包中的一個(gè)子包,它可用于使用Go運(yùn)行外部命令。Goexec命令教程展示了如何在Golang中執(zhí)行shell命令和程序。
要使用這個(gè)包,我們需要按如下方式導(dǎo)入:
import"os/exec"
使用GoLangexec包運(yùn)行命令
我們可以運(yùn)行任何我們希望的命令。就像我們使用CMD、bash或其他一些shell來運(yùn)行命令一樣,它可以運(yùn)行這些命令。
這是運(yùn)行l(wèi)s命令的示例。新建一個(gè)main.go:
packagemain
import(
"fmt"
"os/exec"
funcmain(){
cmd:=exec.Command("ls")
e:=cmd.Run()
CheckError(e)
funcCheckError(eerror){
ife!=nil{
fmt.Println(e)
}
Run函數(shù)啟動(dòng)指定命令并等待它完成,而Start啟動(dòng)指定命令但不等待它完成;我們需要使用WaitwithStart。
然后新建一個(gè)go.mod文件:
$gomodinitmain.go
go:creatingnewgo.mod:modulemain.go
go:toaddmodulerequirementsandsums:
gomodtidy
現(xiàn)在,程序?qū)⑦\(yùn)行,但我們不會(huì)看到控制臺(tái)的任何輸出。原因是命令運(yùn)行,輸出沒有發(fā)送到標(biāo)準(zhǔn)輸出。
$gorunmain.go
所以,我們需要修復(fù)它。添加下面顯示的兩行以查看控制臺(tái)的任何輸出。
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
輸出將顯示當(dāng)前目錄中的文件。
packagemain
import(
"fmt"
"os"
"os/exec"
funcmain(){
cmd:=exec.Command("ls","-lah")
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
e:=cmd.Run()
CheckError(e)
funcCheckError(eerror){
ife!=nil{
fmt.Println(e)
然后我們再程序,可以看到標(biāo)準(zhǔn)臺(tái)輸出如下的文件:
$gorunmain.go
total16
drwxr-xr-x4yuzhou_1sustaff128B51522:56.
drwxr-xr-x23yuzhou_1sustaff736B51522:53..
-rw-r--r--1yuzhou_1sustaff24B51522:56go.mod
-rw-r--r--1yuzhou_1sustaff248B51523:18main.go
利用直接ls直接運(yùn)行該命令,可以看到結(jié)果正確:
$ls-alh
total16
drwxr-xr-x4yuzhou_1sustaff128B51522:56.
drwxr-xr-x23yuzhou_1sustaff736B51522:53..
-rw-r--r--1yuzhou_1sustaff24B51522:56go.mod
-rw-r--r--1yuzhou_1sustaff248B51523:18main.go
為不同的操作系統(tǒng)指定命令
我們可以指定針對不同操作系統(tǒng)運(yùn)行不同的命令(例如Linux上的bash命令)。這是一個(gè)例子。
ifruntime.GOOS=="linux"{
cmd=exec.Command("ls")
為此,我們還需要導(dǎo)入運(yùn)行時(shí)包。
要查看所有可能的操作系統(tǒng),我們可以運(yùn)行g(shù)otooldistlist,它將顯示所有可能的操作系統(tǒng)和ARCH組合。
Goexec命令捕獲輸出
輸出運(yùn)行命令并返回其標(biāo)準(zhǔn)輸出:
packagemain
import(
"fmt"
"log"
"os/exec"
funcmain(){
out,err:=exec.Command("ls","-l").Output()
iferr!=nil{
log.Fatal(err)
fmt.Println(string(out))
運(yùn)行該程序:
$gorunmain.go
total16
-rw-r--r--1yuzhou_1sustaff2451522:56go.mod
-rw-r--r--1yuzhou_1sustaff18051523:33main.go
Gocmd.StdinPipe
管道允許我們將一個(gè)命令的輸出發(fā)送到另一個(gè)命令。StdinPipe返回一個(gè)管道,該管道將在命令啟動(dòng)時(shí)連接到命令的標(biāo)準(zhǔn)輸入。
packagemain
import(
"fmt"
"io"
"log"
"os/exec"
funcmain(){
cmd:=exec.Command("cat")
stdin,err:=cmd.StdinPipe()
iferr!=nil{
log.Fatal(err)
gofunc(){
deferstdin.Close()
io.WriteString(stdin,"anoldfalcon")
out,err:=cmd.CombinedOutput()
iferr!=nil{
log.Fatal(err)
fmt.Printf("%s\n",out)
}
在代碼示例中,我們將字符串寫入goroutine內(nèi)的標(biāo)準(zhǔn)輸入。
cmd:=exec.Command("cat")
cat命令將給定的文件連接到標(biāo)準(zhǔn)輸出。當(dāng)沒有給定文件或帶有-時(shí),該命令讀取標(biāo)準(zhǔn)輸入并將其打印到標(biāo)準(zhǔn)輸出。
stdin,err:=cmd.StdinPipe()
我們得到cat命令的標(biāo)準(zhǔn)輸入管道。
gofunc(){
deferstdin.Close()
io.WriteString(stdin,"anoldfalcon")
}()
在goroutine內(nèi)部,我們將一個(gè)字符串寫入標(biāo)準(zhǔn)輸入管道。
$gorunstdinpipe.go
anoldfalcon
Gocmd.StdoutPipe
StdoutPipe返回一個(gè)管道,該管道將在命令啟動(dòng)時(shí)連接到命令的標(biāo)準(zhǔn)輸出。
packagemain
import(
"fmt"
"io/ioutil"
"log"
"os/exec"
"strings"
funcupper(datastring)string{
returnstrings.ToUpper(data)
funcmain(){
cmd:=exec.Command("echo","anoldfalcon")
stdout,err:=cmd.StdoutPipe()
iferr!=nil{
log.Fatal(err)
iferr:=cmd.Start();err!=nil{
log.Fatal(err)
data,err:=ioutil.ReadAll(stdout)
iferr!=nil{
log.Fatal(err)
iferr:=cmd.Wait();err!=nil{
log.Fatal(err)
fmt.Printf("%s\n",upper(string(data)))
該示例通過管道讀取echo命令的輸出并將其轉(zhuǎn)換為大寫字母。
cmd:=exec.Command("echo","anoldfalcon")
要運(yùn)行的命令是帶有單個(gè)字符串參數(shù)的echo命令。
stdout,err:=cmd.StdoutPipe()
我們得到標(biāo)準(zhǔn)輸出管道。
iferr:=cmd.Start();err!=nil{
log.Fatal(err)
}
該命令使用Start函數(shù)執(zhí)行;它不會(huì)等待它完成。
data,err:=ioutil.ReadAll(stdout)
我們從管道中讀取數(shù)據(jù)。
iferr:=cmd.Wait();err!=nil{
log.Fatal(err)
}
Wait等待命令退出并等待任何復(fù)制到stdin或從stdout或stderr復(fù)制完成。它在看到命令退出后關(guān)閉管道。
運(yùn)行該程序:
$go
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 紅鳳工程協(xié)議書
- 文物看護(hù)員委托協(xié)議書
- 簽師帶徒協(xié)議書
- 老人離院協(xié)議書
- 承辦工作站合作協(xié)議書
- 遂川離婚協(xié)議書
- 紅字發(fā)票協(xié)議書
- 資產(chǎn)出租協(xié)議書
- 精通退課協(xié)議書
- 簽訂拆除協(xié)議書
- 《內(nèi)蒙古乳制品出口貿(mào)易發(fā)展現(xiàn)狀、問題及完善對策研究》10000字
- 研究生開題報(bào)告評審表
- 統(tǒng)編版語文二年級下冊《黃帝的傳說》教學(xué)課件
- SCA涂膠機(jī)定量機(jī)維護(hù)作業(yè)指導(dǎo)書
- 《網(wǎng)絡(luò)安全與個(gè)人信息保護(hù)》主題班會(huì)課件
- 建筑集團(tuán)公司商務(wù)管理手冊(投標(biāo)、合同、采購)分冊
- 蘇教版二年級下冊《磁鐵的磁力》課件
- 幼兒園課件小小銀行家
- 美的空調(diào)制造工藝手冊
- 會(huì)議實(shí)務(wù)之收集與會(huì)人員對會(huì)議的意見和建議
- 大班社會(huì)教案看不見的世界教案及教學(xué)反思
評論
0/150
提交評論