使用Golang执行系统命令
在本教程中,我们将看一下标准库中的os / exec包以及如何使用它在Go应用程序中成功执行系统命令。

##条件
您需要安装Go 1.11+版本
##兼容性问题
只是简单的教程Demo,所以并未对所有平台适用。
###检查当前操作系统 我们可以使用runtime包并检查GOOS常量。这将返回目标的操作系统:
if runtime.GOOS == "windows" {
fmt.Println("无法在Windows机器上执行此操作")
} else {
execute()
}
##上代码
package main
import (
"fmt"
"os/exec"
"runtime"
)
func execute() {
// 这里我们执行pwd命令
// 我们可以将它的输出存储在我们的out变量中
out, err := exec.Command("ls").Output()
// 如果我们的执行有错误
if err != nil {
fmt.Printf("%s", err)
}
// 因为上面定义的out变量是[] byte类型,
// 我们需要将它转换为字符串,否则我们将看到在我们的控制台中打印出乱码
// 这就是我们将它转换为字符串的方式
fmt.Println("命令已成功执行")
output := string(out[:])
fmt.Println(output)
// 让我们试试pwd命令
out, err = exec.Command("pwd").Output()
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println("命令已成功执行")
output = string(out[:])
fmt.Println(output)
}
func main() {
if runtime.GOOS == "windows" {
fmt.Println("无法在Windows机器上执行此操作")
} else {
execute()
}
}
运行一下:
$ go run main.go
命令已成功执行 # ls command
go.mod
main
main.go
myfile.data
命令已成功执行 # pwd command
/Users/michael/go/src/giogui
###传入参数 Passing in Arguments
我们运行了一些非常简单的命令,但是我们如何将参数传递给这些命令呢?
例如,假设我想做ls -ltr而不是标准ls?
其实也容易,我们只需要将这些参数添加到.Command()中,如下所示:
package main
import (
"fmt"
"os/exec"
"runtime"
)
func execute() {
out, err := exec.Command("ls", "-ltr").Output()
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println("命令已成功执行")
output := string(out[:])
fmt.Println(output)
}
func main() {
if runtime.GOOS == "windows" {
fmt.Println("无法在Windows机器上执行此操作")
} else {
execute()
}
}
运行一下看看
$ go run main.go
命令已成功执行
total 4136
-rw------- 1 michael staff 47 Jul 29 15:10 go.mod
-rwxr-xr-x 1 michael staff 2104024 Jul 29 15:11 main
-rwxr-xr-x 1 michael staff 77 Jul 29 21:52 myfile.data
-rw-r--r-- 1 michael staff 1126 Jul 30 07:48 main.go
ps:.Command()的函数也是可变参数,可以传入多个参数给我们的命令来执行。
#小结贴上全部代码
package main
import (
"fmt"
"os/exec"
"runtime"
)
func execute() {
// 这里我们执行pwd命令
// 我们可以将它的输出存储在我们的out变量中
out, err := exec.Command("ls").Output()
// 如果我们的执行有错误
if err != nil {
fmt.Printf("%s", err)
}
// 因为上面定义的out变量是[] byte类型,
//我们需要将它转换为字符串,否则我们将看到在我们的控制台中打印出乱码
// 这就是我们将它转换为字符串的方式
fmt.Println("命令已成功执行")
output := string(out[:])
fmt.Println(output)
// 让我们试试pwd命令
out, err = exec.Command("pwd").Output()
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println("命令已成功执行")
output = string(out[:])
fmt.Println(output)
}
func executeArg() {
out, err := exec.Command("ls", "-ltr").Output()
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println("命令已成功执行")
output := string(out[:])
fmt.Println(output)
}
func main() {
if runtime.GOOS == "windows" {
fmt.Println("无法在Windows机器上执行此操作")
} else {
executeArg()
}
}
最后修改于 2019-07-29