清风徐来
Michael's Blog
使用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