Skip to content

Instantly share code, notes, and snippets.

@nerdatmath
Forked from lee8oi/goshell.go
Last active August 29, 2015 14:17
Show Gist options
  • Save nerdatmath/10f3f254f39f70010ac5 to your computer and use it in GitHub Desktop.
Save nerdatmath/10f3f254f39f70010ac5 to your computer and use it in GitHub Desktop.
package main
import (
"io"
"log"
"os"
"os/exec"
)
func Command(args ...string) {
var ch = make(chan int)
cmd := exec.Command(args[0], args[1:]...)
connect(ch, cmd)
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
_, _ = <-ch, <-ch
}
func connect(ch chan int, c *exec.Cmd) (err error) {
if inp, err := c.StdinPipe(); err == nil {
go loop(ch, os.Stdin, inp)
if outp, err := c.StdoutPipe(); err == nil {
go loop(ch, outp, os.Stdout)
if errp, err := c.StderrPipe(); err == nil {
go loop(ch, errp, os.Stderr)
return nil
}
}
}
log.Fatal(err)
return
}
func loop(ch chan int, inp io.Reader, outp io.Writer) {
var buf = make([]byte, 1)
for {
_, err := inp.Read(buf)
if err == nil {
_, err = outp.Write(buf)
if err == nil {
continue
}
}
ch <- 1
return
}
}
func main() {
Command("bash")
Command("ping", "-c3", "www.google.com")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment