github.com/StackExchange/blackbox/v2@v2.0.1-0.20220331193400-d84e904973ab/pkg/bbutil/runbash.go (about) 1 package bbutil 2 3 import ( 4 "bytes" 5 "fmt" 6 "log" 7 "os" 8 "os/exec" 9 ) 10 11 // RunBash runs a Bash command. 12 func RunBash(command string, args ...string) error { 13 cmd := exec.Command(command, args...) 14 cmd.Stdin = os.Stdin 15 cmd.Stdout = os.Stdout 16 cmd.Stderr = os.Stderr 17 err := cmd.Start() 18 if err != nil { 19 log.Fatal(err) 20 } 21 err = cmd.Wait() 22 if err != nil { 23 return fmt.Errorf("RunBash cmd=%q err=%w", command, err) 24 } 25 return nil 26 } 27 28 // RunBashOutput runs a Bash command, captures output. 29 func RunBashOutput(command string, args ...string) (string, error) { 30 cmd := exec.Command(command, args...) 31 cmd.Stdin = os.Stdin 32 cmd.Stderr = os.Stderr 33 out, err := cmd.Output() 34 if err != nil { 35 return "", fmt.Errorf("RunBashOutput err=%w", err) 36 } 37 return string(out), err 38 } 39 40 // RunBashOutputSilent runs a Bash command, captures output, discards stderr. 41 func RunBashOutputSilent(command string, args ...string) (string, error) { 42 cmd := exec.Command(command, args...) 43 cmd.Stdin = os.Stdin 44 // Leave cmd.Stderr unmodified and stderr is discarded. 45 out, err := cmd.Output() 46 if err != nil { 47 return "", fmt.Errorf("RunBashOutputSilent err=%w", err) 48 } 49 return string(out), err 50 } 51 52 // RunBashInput runs a Bash command, sends input on stdin. 53 func RunBashInput(input string, command string, args ...string) error { 54 55 cmd := exec.Command(command, args...) 56 cmd.Stdin = bytes.NewBuffer([]byte(input)) 57 cmd.Stdout = os.Stdout 58 cmd.Stderr = os.Stderr 59 err := cmd.Run() 60 if err != nil { 61 return fmt.Errorf("RunBashInput err=%w", err) 62 } 63 return nil 64 } 65 66 // RunBashInputOutput runs a Bash command, sends input on stdin. 67 func RunBashInputOutput(input []byte, command string, args ...string) ([]byte, error) { 68 69 cmd := exec.Command(command, args...) 70 cmd.Stdin = bytes.NewBuffer(input) 71 cmd.Stderr = os.Stderr 72 out, err := cmd.Output() 73 if err != nil { 74 return nil, fmt.Errorf("RunBashInputOutput err=%w", err) 75 } 76 return out, nil 77 }