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  }