Redirect stdout pipe of child process in Go

后端 未结 3 921
长发绾君心
长发绾君心 2021-01-29 20:04

I\'m writing a program in Go that executes a server like program (also Go). Now I want to have the stdout of the child program in my terminal window where I started the parent p

相关标签:
3条回答
  • 2021-01-29 20:13

    Now I want to have the stdout of the child program in my terminal window where I started the parent program.

    No need to mess with pipes or goroutines, this one is easy.

    func main() {
        // Replace `ls` (and its arguments) with something more interesting
        cmd := exec.Command("ls", "-l")
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr
        cmd.Run()
    }
    
    0 讨论(0)
  • 2021-01-29 20:25

    I believe that if you import io and os and replace this:

    //fmt.Println(out)
    

    with this:

    go io.Copy(os.Stdout, out)
    

    (see documentation for io.Copy and for os.Stdout), it will do what you want. (Disclaimer: not tested.)

    By the way, you'll probably want to capture standard-error as well, by using the same approach as for standard-output, but with cmd.StderrPipe and os.Stderr.

    0 讨论(0)
  • 2021-01-29 20:32

    For those who don't need this in a loop, but would like the command output to echo into the terminal without having cmd.Wait() blocking other statements:

    package main
    
    import (
        "fmt"
        "io"
        "log"
        "os"
        "os/exec"
    )
    
    func checkError(err error) {
        if err != nil {
            log.Fatalf("Error: %s", err)
        }
    }
    
    func main() {
        // Replace `ls` (and its arguments) with something more interesting
        cmd := exec.Command("ls", "-l")
    
        // Create stdout, stderr streams of type io.Reader
        stdout, err := cmd.StdoutPipe()
        checkError(err)
        stderr, err := cmd.StderrPipe()
        checkError(err)
    
        // Start command
        err = cmd.Start()
        checkError(err)
    
        // Don't let main() exit before our command has finished running
        defer cmd.Wait()  // Doesn't block
    
        // Non-blockingly echo command output to terminal
        go io.Copy(os.Stdout, stdout)
        go io.Copy(os.Stderr, stderr)
    
        // I love Go's trivial concurrency :-D
        fmt.Printf("Do other stuff here! No need to wait.\n\n")
    }
    
    0 讨论(0)
提交回复
热议问题