在Go中redirectsubprocess的stdoutpipe道

我正在用Go编写一个程序,执行一个像程序一样的服务器(也是Go)。 现在我想要在terminal窗口中开始父程序的子程序的标准输出。 一种方法是使用cmd.Output()函数,但是只有在进程退出后才会打印stdout。 (这是一个问题,因为这个类似于服务器的程序运行很长时间,我想读取日志输出)

variablesouttype io.ReadCloser ,我不知道该怎么做才能完成我的任务,在这个主题上我找不到有用的东西。

 func main() { cmd := exec.Command("/path/to/my/child/program") out, err := cmd.StdoutPipe() if err != nil { fmt.Println(err) } err = cmd.Start() if err != nil { fmt.Println(err) } //fmt.Println(out) cmd.Wait() } 

解释代码:取消注释Println函数来获取代码进行编译,我知道Println(out io.ReadCloser)不是一个有意义的函数。
(它产生输出&{3 |0 <nil> 0} )这两行只是需要编译代码。

现在我想要在terminal窗口中开始父程序的子程序的标准输出。

没有必要弄乱pipe道或门厅,这个很容易。

 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() } 

我相信如果你导入ioos并replace它:

 //fmt.Println(out) 

有了这个:

 go io.Copy(os.Stdout, out) 

(请参阅io.Copyos.Stdout文档),它会做你想做的。 (免责声明:未经testing。)

顺便说一句,你可能也想捕获标准错误,通过使用与标准输出相同的方法,但使用cmd.StderrPipeos.Stderr

对于那些在循环中不需要这个的人,但是希望命令输出回显到terminal,而不需要使用cmd.Wait()阻塞其他语句:

 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") }