From 171a34c1d14631009bbc140adb42009a51acbebf Mon Sep 17 00:00:00 2001 From: devlights Date: Mon, 30 Jun 2025 10:15:21 +0000 Subject: [PATCH] Add basic/cmdexec/ospipe.go --- examples/basic/cmdexec/examples.go | 1 + examples/basic/cmdexec/ospipe.go | 68 ++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 examples/basic/cmdexec/ospipe.go diff --git a/examples/basic/cmdexec/examples.go b/examples/basic/cmdexec/examples.go index a383fb4a..336153cf 100644 --- a/examples/basic/cmdexec/examples.go +++ b/examples/basic/cmdexec/examples.go @@ -22,4 +22,5 @@ func (r *register) Regist(m mapping.ExampleMapping) { m["cmdexec_env"] = WithEnv m["cmdexec_dir"] = WithDir m["cmdexec_slice"] = WithSlice + m["cmdexec_ospipe"] = OsPipe } diff --git a/examples/basic/cmdexec/ospipe.go b/examples/basic/cmdexec/ospipe.go new file mode 100644 index 00000000..23f83b27 --- /dev/null +++ b/examples/basic/cmdexec/ospipe.go @@ -0,0 +1,68 @@ +package cmdexec + +import ( + "bufio" + "log" + "os" + "os/exec" +) + +// OsPipe は、(*Cmd).Stdout に os.Pipe の io.Writer を接続して処理するサンプルです. +// +// # REFERENCES +// - https://pkg.go.dev/os@go1.24.4#Pipe +func OsPipe() error { + var ( + pr *os.File + pw *os.File + err error + ) + pr, pw, err = os.Pipe() + if err != nil { + return err + } + defer pr.Close() + + var ( + name = "git" + args = []string{"--no-pager", "log", "-m", "-r", "--name-only", "--pretty=raw", "-z"} + cmd = exec.Command(name, args...) + ) + cmd.Stdout = pw + if err = cmd.Start(); err != nil { + pw.Close() + return err + } + + // 終了待機 + var ( + done = make(chan error, 1) + ) + go func() { + defer pw.Close() + done <- cmd.Wait() + }() + + const ( + MaxTokenSize = 1024 * 1024 + ) + var ( + scanner = bufio.NewScanner(pr) + buf = make([]byte, MaxTokenSize) + ) + scanner.Buffer(buf, MaxTokenSize) + + for scanner.Scan() { + log.Println(scanner.Text()) + } + + if err = scanner.Err(); err != nil { + return err + } + + if err = <-done; err != nil { + return err + } + + return nil +}