最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

golang执行系统命令os exec

Golang 547浏览 0评论

os/exec Command方法

func Command(name string, arg ...string) *Cmd

调用示例

exec.Command("ls", "-a", "-l")

运行系统命令

package main

import (
	"io/ioutil"
	"log"
	"os/exec"
)

func main() {
	// 执行系统命令
	// 第一个参数是命令名称
	// 后面参数可以有多个,命令参数
	cmd := exec.Command("ls", "-a", "-l")
	// 获取输出对象,可以从该对象中读取输出结果
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		log.Fatal(err)
	}
	// 保证关闭输出流
	defer stdout.Close()
	// 运行命令
	if err := cmd.Start(); err != nil {
		log.Fatal(err)
	}
	// 读取输出结果
	opBytes, err := ioutil.ReadAll(stdout)
	if err != nil {
		log.Fatal(err)
	}
	log.Println(string(opBytes))
}

运行

$ go run exec.go 
2016/07/24 22:14:16 total 24
drwxr-xr-x  5 chenjiebin  staff  170 Jul 24 22:10 .
drwxr-xr-x  3 chenjiebin  staff  102 Jul 24 06:38 ..
......

输出重定向到文件

package main

import (
	"log"
	"os"
	"os/exec"
)

func main() {
	cmd := exec.Command("ls", "-a", "-l")
	// 重定向标准输出到文件
	stdout, err := os.OpenFile("stdout.log", os.O_CREATE|os.O_WRONLY, 0600)
	if err != nil {
		log.Fatalln(err)
	}
	defer stdout.Close()
	cmd.Stdout = stdout
	// 执行命令
	if err := cmd.Start(); err != nil {
		log.Println(err)
	}
}

运行

$ go run redirect.go 
执行成功后会将输出内容写入stdout.log

标准错误输出和标准输入重定向的方式类似。

Start和Run的区别

Start执行不会等待命令完成就,Run会阻塞等待命令完成。

package main

import (
	"log"
	"os/exec"
)

func main() {
	cmd := exec.Command("sleep", "5")
	// 如果用Run,执行到该步则会阻塞等待5秒
	// err := cmd.Run()
	err := cmd.Start()
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Waiting for command to finish...")
	// Start,上面的内容会先输出,然后这里会阻塞等待5秒
	err = cmd.Wait()
	log.Printf("Command finished with error: %v", err)
}

转载请注明:快乐编程 » golang执行系统命令os exec

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址