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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
package util
import (
"bytes"
//"fmt"
"os/exec"
"syscall"
)
type Command struct {
name string
Cmd *exec.Cmd
Stdout, Stderr bytes.Buffer
Err error
Status int
}
func NewCommand(name string, arg ...string) *Command {
//fmt.Println(arg)
command := new(Command)
command.name = name
command.Cmd = exec.Command(name, arg...)
return command
}
func (c *Command) Run() error {
c.Cmd.Stdout = &c.Stdout
c.Cmd.Stderr = &c.Stderr
if _, err := exec.LookPath(c.name); err != nil {
c.Err = err
return c.Err
}
if err := c.Cmd.Start(); err != nil {
c.Err = err
return c.Err
}
if err := c.Cmd.Wait(); err != nil {
c.Err = err
if exiterr, ok := err.(*exec.ExitError); ok {
if status, ok := exiterr.Sys().(syscall.WaitStatus); ok {
c.Status = status.ExitStatus()
}
}
} else {
c.Status = 0
}
return c.Err
}
|