Go語言入門exec的基本使用示例_第1頁
Go語言入門exec的基本使用示例_第2頁
Go語言入門exec的基本使用示例_第3頁
Go語言入門exec的基本使用示例_第4頁
Go語言入門exec的基本使用示例_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論