こんにちは、kurumi-bioです。
第6回目のexecパッケージ(標準ライブラリー)の学習です。
環境
StderrPipe関数
func (c *Cmd) StderrPipe() (io.ReadCloser, error)
◆テストコード
package main import ( "fmt" "os" ) func main() { fmt.Fprint(os.Stdout, "stdout!") fmt.Fprint(os.Stderr, "stderr!") }
◆テストコード
package main import ( "fmt" "io" "os" "os/exec" ) func readPrint(r io.Reader) { var a string for { _, e := fmt.Fscan(r, &a) if e == io.EOF { break } if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fscan", e)) break } fmt.Printf("%s\n", a) } } func main() { c := exec.Command("./printOut.exe") s, e := c.StderrPipe() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StderrPipe", e)) } if err := c.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Start", err )) } readPrint(s) if err := c.Wait(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Wait", err )) } }
◆実行結果(Windows)
では、説明に正しくないと記載されていたCmd.Wait()関数の後にパイプを呼び出したらどうなるでしょうか。
◆テストコード
package main import ( "fmt" "io" "os" "os/exec" ) func readPrint(r io.Reader) { var a string for { _, e := fmt.Fscan(r, &a) if e == io.EOF { break } if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fscan", e)) break } fmt.Printf("%s\n", a) } } func main() { c := exec.Command("./printOut.exe") s, e := c.StderrPipe() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StderrPipe", e)) } if err := c.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Start", err)) } if err := c.Wait(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Wait", err)) } readPrint(s) }
◆実行結果(Windows)
では、もう一つ説明に正しくないと記載されていたCmd.Run()関数を使うとどうなるでしょうか。
◆テストコード
package main import ( "fmt" "io" "os" "os/exec" ) func readPrint(r io.Reader) { var a string for { _, e := fmt.Fscan(r, &a) if e == io.EOF { break } if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fscan", e)) break } fmt.Printf("%s\n", a) } } func main() { c := exec.Command("./printOut.exe") s, e := c.StderrPipe() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StderrPipe", e)) } if err := c.Run(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StderrPipe", err)) } readPrint(s) }
◆実行結果(Windows)
StdinPipe関数
func (c *Cmd) StdinPipe() (io.WriteCloser, error)
◆テストコード
package main import ( "fmt" "io" "os" ) func main() { var s string for { _, e := fmt.Fscan(os.Stdin, &s) if e == io.EOF || s == "End" { break } if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fscan", e)) } fmt.Printf("%s\n", s) } }
◆実行結果(Windows)
◆テストコード
package main import ( "fmt" "io" "os" "os/exec" ) func readPrint(r io.Reader) { var a string for { _, e := fmt.Fscan(r, &a) if e == io.EOF || a == "End" { break } if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fscan", e)) break } fmt.Printf("%s\n", a) } } func main() { c := exec.Command("./ReadPrint.exe") so, e := c.StdoutPipe() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StdoutPipe", e)) } si, e2 := c.StdinPipe() if e2 != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StdinPipe", e2)) } _, e = fmt.Fprintln(si, "test") if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fprintln", e)) } e = c.Start() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Start", e)) } _, e = fmt.Fprintln(si, "test2") if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fprintln", e)) } si.Close() readPrint(so) e = c.Wait() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Wait", e)) } }
◆実行結果(Windows)
StdoutPipe関数
func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
◆テストコード
package main import ( "fmt" "io" "os" "os/exec" ) func readPrint(r io.Reader) { var a string for { _, e := fmt.Fscan(r, &a) if e == io.EOF { break } if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fscan", e)) break } fmt.Printf("%s\n", a) } } func main() { c := exec.Command("./printOut.exe") s, e := c.StdoutPipe() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StdoutPipe", e)) } if err := c.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Start", err)) } readPrint(s) if err := c.Wait(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Wait", err)) } }
◆実行結果(Windows)
広告の下に続きます。
String関数
func (c *Cmd) String() string
◆テストコード
package main import ( "fmt" "os/exec" ) func main() { c := exec.Command("./test.exe") fmt.Printf("[%s]\n", c.String()) }
◆実行結果(Windows)
Wait関数
func (c *Cmd) Wait() error
◆テストコード
package main import ( "fmt" "io" "os" ) func main() { var s string for { _, e := fmt.Fscan(os.Stdin, &s) if e == io.EOF { break } if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fscan", e)) } fmt.Fprintf(os.Stdout, "stdout[%s]\n", s) fmt.Fprintf(os.Stderr, "stderr[%s]\n", s) } }
◆テストコード
package main import ( "fmt" "io" "os" "os/exec" ) func readPrint(r io.Reader) { var a string for { _, e := fmt.Fscan(r, &a) if e == io.EOF || a == "End" { break } if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fscan", e)) break } fmt.Printf("%s\n", a) } } func main() { c := exec.Command("./ReadPrint2.exe") se, see := c.StderrPipe() if see != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StdoutPipe", see)) } so, soe := c.StdoutPipe() if soe != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StdoutPipe", soe)) } si, sie := c.StdinPipe() if sie != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.StdinPipe", sie)) } _, e := fmt.Fprintln(si, "test") if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("fmt.Fprintln", e)) } e = c.Start() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Start", e)) } si.Close() readPrint(se) readPrint(so) e = c.Wait() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("Cmd.Wait", e)) } }
◆実行結果(Windows)
最後までご覧いただきありがとうございます