exec 是 os 包中的一个子包,它可用于使用 Go 运行外部命令。Go exec 命令教程展示了如何在 Golang 中执行 shell 命令和程序。
要使用这个包,我们需要按如下方式导入:
import "os/exec"
使用 GoLang exec 包运行命令
我们可以运行任何我们希望的命令。就像我们使用 CMD、bash 或其他一些 shell 来运行命令一样,它可以运行这些命令。
lsmain.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) } }
RunStart
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
Go exec 命令捕获输出
输出运行命令并返回其标准输出:
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