Estoy escribiendo un programa en Go que ejecuta un programa similar a un servidor (también Go). Ahora quiero tener la salida estándar del programa secundario en la ventana de mi terminal donde inicié el programa principal. Una forma de hacer esto es con la cmd.Output()
función, pero esta imprime la salida estándar solo después de que el proceso haya finalizado. (Eso es un problema porque este programa similar a un servidor se ejecuta durante mucho tiempo y quiero leer la salida del registro)
La variable out
es de type io.ReadCloser
y no sé qué debo hacer con ella para lograr mi tarea, y no puedo encontrar nada útil en la web sobre este tema.
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()
}
Explicación del código: descomente la Println
función para que el código se compile, sé que Println(out io.ReadCloser)
no es una función significativa.
(produce la salida &{3 |0 <nil> 0}
) Estas dos líneas solo son necesarias para que el código se compile.
fuente
io.Copy
dentro de las rutinas de gocmd.Wait()
o elfor{}
bucle ... ¿por qué están aquí?Respuestas:
No es necesario meterse con tuberías o goroutines, este es fácil.
fuente
cmd.Stdin = os.Stdin
como si hubiera ejecutado literalmente ese comando desde su shell.log
lugar de stdout, hay una respuesta aquíCreo que si importa
io
yos
y sustituir este:con este:
(ver documentación para
io.Copy
y paraos.Stdout
), hará lo que quieras. (Descargo de responsabilidad: no probado).Por cierto, probablemente también querrá capturar el error estándar, utilizando el mismo enfoque que para la salida estándar, pero con
cmd.StderrPipe
yos.Stderr
.fuente
os.Stdout
) y (2) confirmar la premisa de que, si no llamacmd.StdoutPipe()
en absoluto, la salida estándar va a la/dev/null
salida estándar del proceso padre en lugar de hacerlo .Para aquellos que no necesitan esto en un bucle, pero les gustaría que la salida del comando se hiciera eco en la terminal sin tener que
cmd.Wait()
bloquear otras declaraciones:fuente