在 Go 中執行 Shell 命令
Jay Singh
2023年1月30日
Shell 命令告訴系統如何執行特定任務。外部命令通過包 exec
執行。
os/exec 包與 C 和其他語言的系統庫呼叫不同,它不執行系統 shell,也不擴充套件任何 glob 模式或處理任何類似於 shell 的擴充套件、管道或重定向。
該包更類似於 C 語言中的 exec 系列函式。
在本文中,你將學習如何在 Golang 中執行 shell 或外部命令。
在 Go 中使用 os/exec 包執行 Shell 命令
任何作業系統或系統命令都可以使用 Go 的 os/exec 包觸發。它提供了兩個可用於執行此操作的函式:建立 cmd
物件的命令和執行命令並返回標準輸出的輸出。
package main
import (
"fmt"
"log"
"os/exec"
)
func main() {
out, err := exec.Command("pwd").Output()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
}
輸出:
It will return the location of your current working directory.
現在,讓我們看看我們如何使用 os/exec 包來執行像 ls
這樣的簡單命令。
首先,我們必須匯入三個關鍵包,即 fmt、os/exec 和 runtime。之後,我們將構造一個開始執行程式碼的 execute()
方法。
package main
import (
"fmt"
"os/exec"
"runtime"
)
func execute() {
out, err := exec.Command("ls").Output()
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println("Program executed")
output := string(out[:])
fmt.Println(output)
}
func main() {
if runtime.GOOS == "windows" {
fmt.Println("This program is not aplicable for windows machine.")
} else {
execute()
}
}
輸出:
Program executed
bin
dev
etc
home
lib
lib64
proc
root
sys
tmp
tmpfs
usr
var
在 Go 中使用帶引數的 os/exec 包執行 Shell 命令
Command
函式返回一個 Cmd
結構,該結構可以使用指定的引數執行提供的程式。第一個引數是要執行的程式;其他引數是程式引數。
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
"strings"
)
func main() {
cmd := exec.Command("tr", "a-z", "A-Z")
cmd.Stdin = strings.NewReader("Hello Boss!")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("New Message: %q\n", out.String())
}
輸出:
New Message: "HELLO BOSS!"