Skip to content

Instantly share code, notes, and snippets.

@szaydel
Created September 11, 2015 19:03
Show Gist options
  • Save szaydel/446413da7fe8749a4461 to your computer and use it in GitHub Desktop.
Save szaydel/446413da7fe8749a4461 to your computer and use it in GitHub Desktop.
Access StdIn of Exec'd process with Golang
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, What's your favorite number?")
var i int
fmt.Scanf("%d\n", &i)
fmt.Println("Ah I like ", i, " too.")
}
package main
import (
"fmt"
"io"
"os"
"os/exec"
)
func main() {
subProcess := exec.Command("go", "run", "./helper/main.go") //Just for testing, replace with your subProcess
stdin, err := subProcess.StdinPipe()
if err != nil {
fmt.Println(err) //replace with logger, or anything you want
}
defer stdin.Close() // the doc says subProcess.Wait will close it, but I'm not sure, so I kept this line
subProcess.Stdout = os.Stdout
subProcess.Stderr = os.Stderr
fmt.Println("START") //for debug
if err = subProcess.Start(); err != nil { //Use start, not run
fmt.Println("An error occured: ", err) //replace with logger, or anything you want
}
io.WriteString(stdin, "4\n")
subProcess.Wait()
fmt.Println("END") //for debug
}
@dcrystalj
Copy link

i find this simpler

func callCmd(ctx context.Context, data []byte) ([]byte, error) {
    cmd := exec.CommandContext(ctx, "cmd", "params")
    cmd.Stdin = bytes.NewReader(data)

    // CombinedOutput will wait, then return stdout+stderr in one buffer
    out, err := cmd.CombinedOutput()
    if err != nil {
        return nil, fmt.Errorf("Failed: %w; output: %s", err, string(out))
    }
    return out, nil
}

You can pass data into stdin and retrieve stdout

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment