在 Go 中執行 Shell 命令

Jay Singh 2023年1月30日
  1. 在 Go 中使用 os/exec 包執行 Shell 命令
  2. 在 Go 中使用帶引數的 os/exec 包執行 Shell 命令
在 Go 中執行 Shell 命令

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!"