123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- package execx
- import (
- "bytes"
- "errors"
- "fmt"
- "os/exec"
- "runtime"
- "strings"
- "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
- "github.com/zeromicro/go-zero/tools/goctl/vars"
- )
- // RunFunc defines a function type of Run function
- type RunFunc func(string, string, ...*bytes.Buffer) (string, error)
- // Run provides the execution of shell scripts in golang,
- // which can support macOS, Windows, and Linux operating systems.
- // Other operating systems are currently not supported
- func Run(arg, dir string, in ...*bytes.Buffer) (string, error) {
- goos := runtime.GOOS
- var cmd *exec.Cmd
- switch goos {
- case vars.OsMac, vars.OsLinux:
- cmd = exec.Command("sh", "-c", arg)
- case vars.OsWindows:
- cmd = exec.Command("cmd.exe", "/c", arg)
- default:
- return "", fmt.Errorf("unexpected os: %v", goos)
- }
- if len(dir) > 0 {
- cmd.Dir = dir
- }
- stdout := new(bytes.Buffer)
- stderr := new(bytes.Buffer)
- if len(in) > 0 {
- cmd.Stdin = in[0]
- }
- cmd.Stdout = stdout
- cmd.Stderr = stderr
- err := cmd.Run()
- if err != nil {
- if stderr.Len() > 0 {
- return "", errors.New(strings.TrimSuffix(stderr.String(), pathx.NL))
- }
- return "", err
- }
- return strings.TrimSuffix(stdout.String(), pathx.NL), nil
- }
|