github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/f/exec_command.go (about)

     1  package f
     2  
     3  import (
     4  	"bufio"
     5  	"log"
     6  	"os/exec"
     7  	"runtime/debug"
     8  )
     9  
    10  // ExecCommandOutput 执行命令后获取输出结果.
    11  func ExecCommandOutput(command string, arg ...string) (string, error) {
    12  	out, err := exec.Command(command, arg...).Output()
    13  	if err != nil {
    14  		log.Println("callCommand failed!")
    15  		log.Println("")
    16  		log.Println(string(debug.Stack()))
    17  		return "", err
    18  	}
    19  	return String(out), nil
    20  }
    21  
    22  // ExecCommandOutputScanner 执行命令后一行一行的扫描输出结果.
    23  func ExecCommandOutputScanner(command string, arg []string, lineScanner func([]byte) bool, splits ...bufio.SplitFunc) error {
    24  	cmd := exec.Command(command, arg...)
    25  	out, err := cmd.StdoutPipe()
    26  	if err != nil {
    27  		return err
    28  	}
    29  	if err := cmd.Start(); err != nil {
    30  		return err
    31  	}
    32  	bs := bufio.NewScanner(out)
    33  	for _, split := range splits {
    34  		bs.Split(split)
    35  	}
    36  	for bs.Scan() {
    37  		line := bs.Bytes()
    38  		if lineScanner(line) == false {
    39  			break
    40  		}
    41  	}
    42  	return bs.Err()
    43  }