github.com/WindomZ/go-commander@v1.2.2/exec.go (about) 1 package commander 2 3 import ( 4 "bytes" 5 "errors" 6 "os" 7 "os/exec" 8 "regexp" 9 "strings" 10 ) 11 12 var Exec Execute = newExec() 13 14 type Execute interface { 15 ExecPipeCommand(name string, arg ...string) (string, string, error) 16 ExecStdCommand(name string, arg ...string) (string, error) 17 ExecPipeStatementCommand(statement string) (string, string, error) 18 ExecStdStatementCommand(statement string) (string, error) 19 SplitCommandStatement(statement string) (result []string) 20 } 21 22 type _Exec struct { 23 } 24 25 func newExec() *_Exec { 26 return &_Exec{} 27 } 28 29 func (e _Exec) ExecPipeCommand(name string, arg ...string) (string, string, error) { 30 var stdout bytes.Buffer 31 var stderr bytes.Buffer 32 33 cmd := exec.Command(name, arg...) 34 cmd.Stdout = &stdout 35 cmd.Stderr = &stderr 36 37 if err := cmd.Start(); err != nil { 38 return stdout.String(), stderr.String(), err 39 } 40 if err := cmd.Wait(); err != nil { 41 return stdout.String(), stderr.String(), err 42 } 43 return stdout.String(), stderr.String(), nil 44 } 45 46 func (e _Exec) ExecStdCommand(name string, arg ...string) (string, error) { 47 stdout, stderr, err := e.ExecPipeCommand(name, arg...) 48 os.Stdout.WriteString(stdout) 49 os.Stderr.WriteString(stderr) 50 if err != nil { 51 os.Stderr.WriteString(err.Error()) 52 return strings.TrimSpace(stdout + stderr), err 53 } else if len(stderr) != 0 { 54 return stdout, errors.New(stderr) 55 } 56 return stdout, nil 57 } 58 59 func (e _Exec) ExecPipeStatementCommand(statement string) (string, string, error) { 60 return e.ExecPipeCommand( 61 "/bin/bash", 62 "-c", 63 statement, 64 ) 65 } 66 67 func (e _Exec) ExecStdStatementCommand(statement string) (string, error) { 68 return e.ExecStdCommand( 69 "/bin/bash", 70 "-c", 71 statement, 72 ) 73 } 74 75 func (e _Exec) SplitCommandStatement(statement string) (result []string) { 76 result = regexp.MustCompile(`([^\\]"[\w\s\S]+?[^\\]")|([^\s\\]+)`). 77 FindAllString(statement, -1) 78 for i, str := range result { 79 result[i] = strings.TrimSpace(str) 80 } 81 return 82 }