execx.go 664 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package execx
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "os/exec"
  7. "runtime"
  8. )
  9. func Run(arg string, dir string) (string, error) {
  10. goos := runtime.GOOS
  11. var cmd *exec.Cmd
  12. switch goos {
  13. case "darwin", "linux":
  14. cmd = exec.Command("sh", "-c", arg)
  15. case "windows":
  16. cmd = exec.Command("cmd.exe", "/c", arg)
  17. default:
  18. return "", fmt.Errorf("unexpected os: %v", goos)
  19. }
  20. if len(dir) > 0 {
  21. cmd.Dir = dir
  22. }
  23. dtsout := new(bytes.Buffer)
  24. stderr := new(bytes.Buffer)
  25. cmd.Stdout = dtsout
  26. cmd.Stderr = stderr
  27. err := cmd.Run()
  28. if err != nil {
  29. if stderr.Len() > 0 {
  30. return "", errors.New(stderr.String())
  31. }
  32. return "", err
  33. }
  34. return dtsout.String(), nil
  35. }