github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/executil/std_run.go (about) 1 package executil 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 "os/exec" 8 "path" 9 "strings" 10 11 "github.com/fatih/color" 12 ) 13 14 func StdRun(cmd *exec.Cmd) { 15 cwd, _ := os.Getwd() 16 17 envVars := EnvVars{} 18 envVars.LoadFromEnviron() 19 20 fmt.Fprintf(os.Stdout, "%s %s\n", color.CyanString(path.Join(cwd, cmd.Dir)), envVars.Parse(strings.Join(cmd.Args, " "))) 21 { 22 stdoutPipe, err := cmd.StdoutPipe() 23 if err != nil { 24 panic(err) 25 } 26 go scanAndStdout(bufio.NewScanner(stdoutPipe)) 27 } 28 { 29 stderrPipe, err := cmd.StderrPipe() 30 if err != nil { 31 panic(err) 32 } 33 go scanAndStderr(bufio.NewScanner(stderrPipe)) 34 } 35 36 if err := cmd.Run(); err != nil { 37 fmt.Fprintln(os.Stderr, color.RedString(">> %s", err.Error())) 38 os.Exit(1) 39 } 40 } 41 42 func scanAndStdout(scanner *bufio.Scanner) { 43 for scanner.Scan() { 44 fmt.Fprintln(os.Stdout, color.GreenString(">> %s", scanner.Text())) 45 } 46 } 47 48 func scanAndStderr(scanner *bufio.Scanner) { 49 for scanner.Scan() { 50 fmt.Fprintln(os.Stderr, color.RedString(">> %s", scanner.Text())) 51 } 52 }