




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Go語言入門exec的基本使用示例目錄使用GoLangexec包運行命令為不同的操作系統(tǒng)指定命令Goexec命令捕獲輸出Gocmd.StdinPipeGocmd.StdoutPipe總結(jié)Exec是os包中的一個子包,它可用于使用Go運行外部命令。Goexec命令教程展示了如何在Golang中執(zhí)行shell命令和程序。
要使用這個包,我們需要按如下方式導(dǎo)入:
import"os/exec"
使用GoLangexec包運行命令
我們可以運行任何我們希望的命令。就像我們使用CMD、bash或其他一些shell來運行命令一樣,它可以運行這些命令。
這是運行l(wèi)s命令的示例。新建一個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ù)啟動指定命令并等待它完成,而Start啟動指定命令但不等待它完成;我們需要使用WaitwithStart。
然后新建一個go.mod文件:
$gomodinitmain.go
go:creatingnewgo.mod:modulemain.go
go:toaddmodulerequirementsandsums:
gomodtidy
現(xiàn)在,程序?qū)⑦\行,但我們不會看到控制臺的任何輸出。原因是命令運行,輸出沒有發(fā)送到標(biāo)準(zhǔn)輸出。
$gorunmain.go
所以,我們需要修復(fù)它。添加下面顯示的兩行以查看控制臺的任何輸出。
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)臺輸出如下的文件:
$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直接運行該命令,可以看到結(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)運行不同的命令(例如Linux上的bash命令)。這是一個例子。
ifruntime.GOOS=="linux"{
cmd=exec.Command("ls")
為此,我們還需要導(dǎo)入運行時包。
要查看所有可能的操作系統(tǒng),我們可以運行g(shù)otooldistlist,它將顯示所有可能的操作系統(tǒng)和ARCH組合。
Goexec命令捕獲輸出
輸出運行命令并返回其標(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))
運行該程序:
$gorunmain.go
total16
-rw-r--r--1yuzhou_1sustaff2451522:56go.mod
-rw-r--r--1yuzhou_1sustaff18051523:33main.go
Gocmd.StdinPipe
管道允許我們將一個命令的輸出發(fā)送到另一個命令。StdinPipe返回一個管道,該管道將在命令啟動時連接到命令的標(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)沒有給定文件或帶有-時,該命令讀取標(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)部,我們將一個字符串寫入標(biāo)準(zhǔn)輸入管道。
$gorunstdinpipe.go
anoldfalcon
Gocmd.StdoutPipe
StdoutPipe返回一個管道,該管道將在命令啟動時連接到命令的標(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")
要運行的命令是帶有單個字符串參數(shù)的echo命令。
stdout,err:=cmd.StdoutPipe()
我們得到標(biāo)準(zhǔn)輸出管道。
iferr:=cmd.Start();err!=nil{
log.Fatal(err)
}
該命令使用Start函數(shù)執(zhí)行;它不會等待它完成。
data,err:=ioutil.ReadAll(stdout)
我們從管道中讀取數(shù)據(jù)。
iferr:=cmd.Wait();err!=nil{
log.Fatal(err)
}
Wait等待命令退出并等待任何復(fù)制到stdin或從stdout或stderr復(fù)制完成。它在看到命令退出后關(guān)閉管道。
運行該程序:
$go
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 應(yīng)急管理信息化工程師崗位面試問題及答案
- 2025屆廣東省惠州市實驗中學(xué)高二下化學(xué)期末教學(xué)質(zhì)量檢測模擬試題含解析
- 廣東省深圳實驗學(xué)校高中部2025屆高二化學(xué)第二學(xué)期期末聯(lián)考試題含解析
- 忻州一中2025屆高一化學(xué)第二學(xué)期期末檢測模擬試題含解析
- 2025屆重慶市普通高中化學(xué)高一下期末教學(xué)質(zhì)量檢測模擬試題含解析
- 2025屆安徽省安慶市達(dá)標(biāo)名校高一化學(xué)第二學(xué)期期末聯(lián)考試題含解析
- 廣西蒙山縣一中2025屆高一下化學(xué)期末達(dá)標(biāo)檢測試題含解析
- 冶金設(shè)備安全管理辦法
- 供電企業(yè)信條管理辦法
- 桃江人才引進(jìn)管理辦法
- 全國中醫(yī)藥職業(yè)教育技能大賽針灸推拿技能大賽方案
- 2024至2030年中國漢白玉石雕數(shù)據(jù)監(jiān)測研究報告
- 三年級下冊混合計算題100道及答案
- DB12T 998-2020 殯葬服務(wù)機(jī)構(gòu)消毒衛(wèi)生規(guī)范
- 廣東省廣州市五校2023-2024學(xué)年高一下學(xué)期期末聯(lián)考化學(xué)試卷
- 2024年天津高考數(shù)學(xué)真題試題(原卷版+含解析)
- 《大數(shù)據(jù)分析技術(shù)》課程標(biāo)準(zhǔn)
- 最簡單封陽臺安全免責(zé)協(xié)議書
- 2024年危險化學(xué)品經(jīng)營單位安全管理人員考試練習(xí)題(附答案)
- (正式版)JBT 3300-2024 平衡重式叉車 整機(jī)試驗方法
- 《無人機(jī)航跡規(guī)劃》課程標(biāo)準(zhǔn)(高職)
評論
0/150
提交評論