-
Notifications
You must be signed in to change notification settings - Fork 0
/
execUtil.go
64 lines (55 loc) · 1.04 KB
/
execUtil.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package main
import (
"os/exec"
// "fmt"
"bufio"
"log"
)
type Line struct {
val string
}
// run program and write each line from stdout into a channel
func runExec(commandAndArgs []string) chan *Line {
command := commandAndArgs[0]
args := commandAndArgs[1:]
lines := make(chan *Line, 1024)
cmd := exec.Command(command, args[0:]...)
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
go func() {
var si *Line
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
line := scanner.Text()
si = new(Line)
si.val = line
lines <- si
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
close(lines)
stdout.Close()
if err := cmd.Wait(); err != nil {
log.Fatal(err)
}
}()
return lines
}
func Readln(r *bufio.Reader) (string, error) {
var (
isPrefix bool = true
err error = nil
line, ln []byte
)
for isPrefix && err == nil {
line, isPrefix, err = r.ReadLine()
ln = append(ln, line...)
}
return string(ln), err
}