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