os/exec Command方法
func Command(name string, arg ...string) *Cmd
调用示例
exec.Command("ls", "-a", "-l")
运行系统命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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 .. ......
输出重定向到文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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会阻塞等待命令完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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) } |