Go exec用法

简介

exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o.

type Cmd   //表示一个正在准备或者正在运行的外部命令

  1. type Cmd struct {
  2. Path string   //运行命令的路径,绝对路径或者相对路径
  3. Args []string   // 命令参数
  4. Env []string //进程环境,如果环境为空,则使用当前进程的环境
  5. Dir string   //指定command的工作目录,如果dir为空,则comman在调用进程所在当前目录中运行
  6. Stdin io.Reader  //标准输入,如果stdin是nil的话,进程从null device中读取(os.DevNull),stdin也可以时一个文件,否则的话则在运行过程中再开一个goroutine去
  7.              //读取标准输入
  8. Stdout io.Writer //标准输出
  9. Stderr io.Writer  //错误输出,如果这两个(Stdout和Stderr)为空的话,则command运行时将响应的文件描述符连接到os.DevNull
  10. ExtraFiles []*os.File   
  11. SysProcAttr *syscall.SysProcAttr
  12. Process *os.Process //Process是底层进程,只启动一次
  13. ProcessState *os.ProcessState  //ProcessState包含一个退出进程的信息,当进程调用Wait或者Run时便会产生该信息.
  14. }

简单例子如下

  1. package main
  2. import (
  3. "fmt"
  4. "os/exec" // "os/exec" in go1
  5. )
  6. func main() {
  7. cmd := exec.Command("ls", "-al")
  8. buf, err := cmd.Output()
  9. fmt.Printf("%s\n%s", buf, err)
  10. }

不过这样执行有的时候会在Golang中运行exec.Command时出现“exit status 1”错误

解决方案如下

  1. cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
  2. var out bytes.Buffer
  3. var stderr bytes.Buffer
  4. cmd.Stdout = &out
  5. cmd.Stderr = &stderr
  6. err := cmd.Run()
  7. if err != nil {
  8. fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
  9. return
  10. }

这个时候会把错误提示显示出来。