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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Go語言入門exec的基本使用示例目錄使用GoLangexec包運行命令為不同的操作系統指定命令Goexec命令捕獲輸出Gocmd.StdinPipeGocmd.StdoutPipe總結Exec是os包中的一個子包,它可用于使用Go運行外部命令。Goexec命令教程展示了如何在Golang中執行shell命令和程序。

要使用這個包,我們需要按如下方式導入:

import"os/exec"

使用GoLangexec包運行命令

我們可以運行任何我們希望的命令。就像我們使用CMD、bash或其他一些shell來運行命令一樣,它可以運行這些命令。

這是運行ls命令的示例。新建一個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函數啟動指定命令并等待它完成,而Start啟動指定命令但不等待它完成;我們需要使用WaitwithStart。

然后新建一個go.mod文件:

$gomodinitmain.go

go:creatingnewgo.mod:modulemain.go

go:toaddmodulerequirementsandsums:

gomodtidy

現在,程序將運行,但我們不會看到控制臺的任何輸出。原因是命令運行,輸出沒有發送到標準輸出。

$gorunmain.go

所以,我們需要修復它。添加下面顯示的兩行以查看控制臺的任何輸出。

cmd.Stdout=os.Stdout

cmd.Stderr=os.Stderr

輸出將顯示當前目錄中的文件。

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)

然后我們再程序,可以看到標準臺輸出如下的文件:

$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直接運行該命令,可以看到結果正確:

$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

為不同的操作系統指定命令

我們可以指定針對不同操作系統運行不同的命令(例如Linux上的bash命令)。這是一個例子。

ifruntime.GOOS=="linux"{

cmd=exec.Command("ls")

為此,我們還需要導入運行時包。

要查看所有可能的操作系統,我們可以運行gotooldistlist,它將顯示所有可能的操作系統和ARCH組合。

Goexec命令捕獲輸出

輸出運行命令并返回其標準輸出:

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

管道允許我們將一個命令的輸出發送到另一個命令。StdinPipe返回一個管道,該管道將在命令啟動時連接到命令的標準輸入。

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內的標準輸入。

cmd:=exec.Command("cat")

cat命令將給定的文件連接到標準輸出。當沒有給定文件或帶有-時,該命令讀取標準輸入并將其打印到標準輸出。

stdin,err:=cmd.StdinPipe()

我們得到cat命令的標準輸入管道。

gofunc(){

deferstdin.Close()

io.WriteString(stdin,"anoldfalcon")

}()

在goroutine內部,我們將一個字符串寫入標準輸入管道。

$gorunstdinpipe.go

anoldfalcon

Gocmd.StdoutPipe

StdoutPipe返回一個管道,該管道將在命令啟動時連接到命令的標準輸出。

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命令的輸出并將其轉換為大寫字母。

cmd:=exec.Command("echo","anoldfalcon")

要運行的命令是帶有單個字符串參數的echo命令。

stdout,err:=cmd.StdoutPipe()

我們得到標準輸出管道。

iferr:=cmd.Start();err!=nil{

log.Fatal(err)

}

該命令使用Start函數執行;它不會等待它完成。

data,err:=ioutil.ReadAll(stdout)

我們從管道中讀取數據。

iferr:=cmd.Wait();err!=nil{

log.Fatal(err)

}

Wait等待命令退出并等待任何復制到stdin或從stdout或stderr復制完成。它在看到命令退出后關閉管道。

運行該程序:

$go

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論