<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Exec 是 os 包中的一個子包,它可用於使用 Go 執行外部命令。Go exec 命令教學展示瞭如何在 Golang 中執行 shell 命令和程式。
要使用這個包,我們需要按如下方式匯入:
import "os/exec"
我們可以執行任何我們希望的命令。就像我們使用 CMD、bash 或其他一些 shell 來執行命令一樣,它可以執行這些命令。
這是執行 ls 命令的範例。新建一個 main.go :
package main import ( "fmt" "os/exec" ) func main() { cmd := exec.Command("ls") e := cmd.Run() CheckError(e) } func CheckError(e error) { if e != nil { fmt.Println(e) } }
Run 函數啟動指定命令並等待它完成,而 Start 啟動指定命令但不等待它完成;我們需要使用Wait with Start。
然後新建一個 go.mod 檔案:
$ go mod init main.go go: creating new go.mod: module main.go go: to add module requirements and sums: go mod tidy
現在,程式將執行,但我們不會看到控制檯的任何輸出。原因是命令執行,輸出沒有傳送到標準輸出。
$ go run main.go
所以,我們需要修復它。新增下面顯示的兩行以檢視控制檯的任何輸出。
cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr
輸出將顯示當前目錄中的檔案。
package main import ( "fmt" "os" "os/exec" ) func main() { cmd := exec.Command("ls", "-lah") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr e := cmd.Run() CheckError(e) } func CheckError(e error) { if e != nil { fmt.Println(e) } }
然後我們再程式,可以看到標準臺輸出如下的檔案:
$ go run main.go total 16 drwxr-xr-x 4 yuzhou_1su staff 128B 5 15 22:56 . drwxr-xr-x 23 yuzhou_1su staff 736B 5 15 22:53 .. -rw-r--r-- 1 yuzhou_1su staff 24B 5 15 22:56 go.mod -rw-r--r-- 1 yuzhou_1su staff 248B 5 15 23:18 main.go
利用直接 ls 直接執行該命令,可以看到結果正確:
$ ls -alh total 16 drwxr-xr-x 4 yuzhou_1su staff 128B 5 15 22:56 . drwxr-xr-x 23 yuzhou_1su staff 736B 5 15 22:53 .. -rw-r--r-- 1 yuzhou_1su staff 24B 5 15 22:56 go.mod -rw-r--r-- 1 yuzhou_1su staff 248B 5 15 23:18 main.go
我們可以指定針對不同作業系統執行不同的命令(例如 Linux 上的 bash 命令)。這是一個例子。
if runtime.GOOS == "linux" { cmd = exec.Command("ls") }
為此,我們還需要匯入執行時包。
要檢視所有可能的作業系統,我們可以執行 go tool dist list ,它將顯示所有可能的作業系統和 ARCH 組合。
輸出執行命令並返回其標準輸出:
package main import ( "fmt" "log" "os/exec" ) func main() { out, err := exec.Command("ls", "-l").Output() if err != nil { log.Fatal(err) } fmt.Println(string(out)) }
執行該程式:
$ go run main.go total 16 -rw-r--r-- 1 yuzhou_1su staff 24 5 15 22:56 go.mod -rw-r--r-- 1 yuzhou_1su staff 180 5 15 23:33 main.go
管道允許我們將一個命令的輸出傳送到另一個命令。 StdinPipe 返回一個管道,該管道將在命令啟動時連線到命令的標準輸入。
package main import ( "fmt" "io" "log" "os/exec" ) func main() { cmd := exec.Command("cat") stdin, err := cmd.StdinPipe() if err != nil { log.Fatal(err) } go func() { defer stdin.Close() io.WriteString(stdin, "an old falcon") }() out, err := cmd.CombinedOutput() if err != nil { log.Fatal(err) } fmt.Printf("%sn", out) }
在程式碼範例中,我們將字串寫入 goroutine 內的標準輸入。
cmd := exec.Command("cat")
cat 命令將給定的檔案連線到標準輸出。當沒有給定檔案或帶有 - 時,該命令讀取標準輸入並將其列印到標準輸出。
stdin, err := cmd.StdinPipe()
我們得到 cat 命令的標準輸入管道。
go func() { defer stdin.Close() io.WriteString(stdin, "an old falcon") }()
在 goroutine 內部,我們將一個字串寫入標準輸入管道。
$ go run stdinpipe.go an old falcon
StdoutPipe 返回一個管道,該管道將在命令啟動時連線到命令的標準輸出。
package main import ( "fmt" "io/ioutil" "log" "os/exec" "strings" ) func upper(data string) string { return strings.ToUpper(data) } func main() { cmd := exec.Command("echo", "an old falcon") stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } if err := cmd.Start(); err != nil { log.Fatal(err) } data, err := ioutil.ReadAll(stdout) if err != nil { log.Fatal(err) } if err := cmd.Wait(); err != nil { log.Fatal(err) } fmt.Printf("%sn", upper(string(data))) }
該範例通過管道讀取 echo 命令的輸出並將其轉換為大寫字母。
cmd := exec.Command("echo", "an old falcon")
要執行的命令是帶有單個字串引數的 echo 命令。
stdout, err := cmd.StdoutPipe()
我們得到標準輸出管道。
if err := cmd.Start(); err != nil { log.Fatal(err) }
該命令使用 Start 函數執行;它不會等待它完成。
data, err := ioutil.ReadAll(stdout)
我們從管道中讀取資料。
if err := cmd.Wait(); err != nil { log.Fatal(err) }
Wait 等待命令退出並等待任何複製到 stdin 或從 stdout 或 stderr 複製完成。它在看到命令退出後關閉管道。
執行該程式:
$ go run stdoutpipe.go AN OLD FALCON
os/exec 包執行外部命令。它包裝了 os.StartProcess 以便更輕鬆地重新對映標準輸入和標準輸出、將 I/O 與管道連線以及進行其他調整。
參考連結:
https://zetcode.com/golang/exec-command/
以上就是Go語言入門exec的基本使用範例的詳細內容,更多關於Go語言exec用例的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45