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  }