cmd.go 1.2 KB
Newer Older
1
package cmd
J
Jingwen Owen Ou 已提交
2 3

import (
J
Jingwen Owen Ou 已提交
4
	"fmt"
J
Jingwen Owen Ou 已提交
5
	"os"
J
Jingwen Owen Ou 已提交
6
	"os/exec"
J
Jingwen Owen Ou 已提交
7
	"strings"
J
Jingwen Owen Ou 已提交
8
	"syscall"
J
Jingwen Owen Ou 已提交
9 10
)

11
type Cmd struct {
J
Jingwen Owen Ou 已提交
12 13 14 15
	Name string
	Args []string
}

J
Jingwen Owen Ou 已提交
16 17 18 19
func (cmd Cmd) String() string {
	return fmt.Sprintf("%s %s", cmd.Name, strings.Join(cmd.Args, " "))
}

20
func (cmd *Cmd) WithArg(arg string) *Cmd {
J
Jingwen Owen Ou 已提交
21 22 23 24 25
	cmd.Args = append(cmd.Args, arg)

	return cmd
}

26 27 28 29 30 31
func (cmd *Cmd) WithArgs(args ...string) *Cmd {
	cmd.Args = append(cmd.Args, args...)

	return cmd
}

32
func (cmd *Cmd) ExecOutput() (string, error) {
33
	output, err := exec.Command(cmd.Name, cmd.Args...).CombinedOutput()
J
Jingwen Owen Ou 已提交
34

35
	return string(output), err
J
Jingwen Owen Ou 已提交
36 37
}

38
func (cmd *Cmd) Exec() error {
J
Jingwen Owen Ou 已提交
39 40 41 42 43 44
	binary, lookErr := exec.LookPath(cmd.Name)
	if lookErr != nil {
		return fmt.Errorf("command not found: %s", cmd.Name)
	}

	c := exec.Command(binary, cmd.Args...)
J
Jingwen Owen Ou 已提交
45 46 47 48 49 50 51
	c.Stdin = os.Stdin
	c.Stdout = os.Stdout
	c.Stderr = os.Stderr

	return c.Run()
}

J
Jingwen Owen Ou 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65
func (cmd *Cmd) SysExec() error {
	binary, lookErr := exec.LookPath(cmd.Name)
	if lookErr != nil {
		return fmt.Errorf("command not found: %s", cmd.Name)
	}

	args := []string{cmd.Name}
	args = append(args, cmd.Args...)

	env := os.Environ()

	return syscall.Exec(binary, args, env)
}

66 67
func New(name string) *Cmd {
	return &Cmd{name, make([]string, 0)}
J
Jingwen Owen Ou 已提交
68
}
J
Jingwen Owen Ou 已提交
69 70 71 72

func NewWithArray(cmd []string) *Cmd {
	return &Cmd{cmd[0], cmd[1:]}
}