Skip to content

Commit 1964c2f

Browse files
authored
Merge pull request #933 from devlights/add-cmdexec-ospipe
2 parents 74f6d00 + 171a34c commit 1964c2f

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

examples/basic/cmdexec/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2222
m["cmdexec_env"] = WithEnv
2323
m["cmdexec_dir"] = WithDir
2424
m["cmdexec_slice"] = WithSlice
25+
m["cmdexec_ospipe"] = OsPipe
2526
}

examples/basic/cmdexec/ospipe.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package cmdexec
2+
3+
import (
4+
"bufio"
5+
"log"
6+
"os"
7+
"os/exec"
8+
)
9+
10+
// OsPipe は、(*Cmd).Stdout に os.Pipe の io.Writer を接続して処理するサンプルです.
11+
//
12+
// # REFERENCES
13+
// - https://pkg.go.dev/os@go1.24.4#Pipe
14+
func OsPipe() error {
15+
var (
16+
pr *os.File
17+
pw *os.File
18+
err error
19+
)
20+
pr, pw, err = os.Pipe()
21+
if err != nil {
22+
return err
23+
}
24+
defer pr.Close()
25+
26+
var (
27+
name = "git"
28+
args = []string{"--no-pager", "log", "-m", "-r", "--name-only", "--pretty=raw", "-z"}
29+
cmd = exec.Command(name, args...)
30+
)
31+
cmd.Stdout = pw
32+
if err = cmd.Start(); err != nil {
33+
pw.Close()
34+
return err
35+
}
36+
37+
// 終了待機
38+
var (
39+
done = make(chan error, 1)
40+
)
41+
go func() {
42+
defer pw.Close()
43+
done <- cmd.Wait()
44+
}()
45+
46+
const (
47+
MaxTokenSize = 1024 * 1024
48+
)
49+
var (
50+
scanner = bufio.NewScanner(pr)
51+
buf = make([]byte, MaxTokenSize)
52+
)
53+
scanner.Buffer(buf, MaxTokenSize)
54+
55+
for scanner.Scan() {
56+
log.Println(scanner.Text())
57+
}
58+
59+
if err = scanner.Err(); err != nil {
60+
return err
61+
}
62+
63+
if err = <-done; err != nil {
64+
return err
65+
}
66+
67+
return nil
68+
}

0 commit comments

Comments
 (0)