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  }