- Open the console and create the folder chapter01/recipe10.
- Navigate to the directory.
- Create the main_read_output.go file with the following content:
package main
import (
"fmt"
"os/exec"
"runtime"
)
func main() {
var cmd string
if runtime.GOOS == "windows" {
cmd = "dir"
} else {
cmd = "ls"
}
proc := exec.Command(cmd)
// Output will run the process
// terminates and returns the standard
// output in a byte slice.
buff, err := proc.Output()
if err != nil {
panic(err)
}
// The output of child
// process in form
// of byte slice
// printed as string
fmt.Println(string(buff))
}
- Run the code by executing go run main_read_output.go.
- See the output in the Terminal:
- Create the main_read_stdout.go file with the following content:
package main
import (
"bytes"
"fmt"
"os/exec"
"runtime"
)
func main() {
var cmd string
if runtime.GOOS == "windows" {
cmd = "dir"
} else {
cmd = "ls"
}
proc := exec.Command(cmd)
buf := bytes.NewBuffer([]byte{})
// The buffer which implements
// io.Writer interface is assigned to
// Stdout of the process
proc.Stdout = buf
// To avoid race conditions
// in this example. We wait till
// the process exit.
proc.Run()
// The process writes the output to
// to buffer and we use the bytes
// to print the output.
fmt.Println(string(buf.Bytes()))
}
- Run the code by executing go run main_read_stdout.go.
- See the output in the Terminal:
- Create the main_read_read.go file with the following content:
package main
import (
"bufio"
"context"
"fmt"
"os/exec"
"time"
)
func main() {
cmd := "ping"
timeout := 2 * time.Second
// The command line tool
// "ping" is executed for
// 2 seconds
ctx, _ := context.WithTimeout(context.TODO(), timeout)
proc := exec.CommandContext(ctx, cmd, "example.com")
// The process output is obtained
// in form of io.ReadCloser. The underlying
// implementation use the os.Pipe
stdout, _ := proc.StdoutPipe()
defer stdout.Close()
// Start the process
proc.Start()
// For more comfortable reading the
// bufio.Scanner is used.
// The read call is blocking.
s := bufio.NewScanner(stdout)
for s.Scan() {
fmt.Println(s.Text())
}
}
- Run the code by executing go run main_read.go.
- See the output in the Terminal:
- Create the sample.go file with the following content:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
sc := bufio.NewScanner(os.Stdin)
for sc.Scan() {
fmt.Println(sc.Text())
}
}
- Create the main.go file with the following content:
package main
import (
"bufio"
"fmt"
"io"
"os/exec"
"time"
)
func main() {
cmd := []string{"go", "run", "sample.go"}
// The command line tool
// "ping" is executed for
// 2 seconds
proc := exec.Command(cmd[0], cmd[1], cmd[2])
// The process input is obtained
// in form of io.WriteCloser. The underlying
// implementation use the os.Pipe
stdin, _ := proc.StdinPipe()
defer stdin.Close()
// For debugging purposes we watch the
// output of the executed process
stdout, _ := proc.StdoutPipe()
defer stdout.Close()
go func() {
s := bufio.NewScanner(stdout)
for s.Scan() {
fmt.Println("Program says:" + s.Text())
}
}()
// Start the process
proc.Start()
// Now the following lines
// are written to child
// process standard input
fmt.Println("Writing input")
io.WriteString(stdin, "Hello\n")
io.WriteString(stdin, "Golang\n")
io.WriteString(stdin, "is awesome\n")
time.Sleep(time.Second * 2)
proc.Process.Kill()
}
- Run the code by executing go run main.go.
- See the output in the Terminal: