2009-12-09 13 views

Respuesta

4

Uso exec.Run especificando Pipe como la salida estándar (stderr y si lo desea). Devolverá cmd, que contiene un os.File en los campos Stdout (y Stderr). Luego puede leerlo usando, por ejemplo, ioutil.ReadAll.

Ejemplo:

package main 

import (
    "exec"; 
    "io/ioutil"; 
) 

func main() { 
    if cmd, e := exec.Run("/bin/ls", nil, nil, exec.DevNull, exec.Pipe, exec.MergeWithStdout); e == nil { 
     b, _ := ioutil.ReadAll(cmd.Stdout) 
     println("output: " + string(b)) 
    } 
} 
+3

No creo que el paquete "exec" ya exista. Tuve que usar "os/exec" como figura en Fatih a continuación. –

2

Use exec.Run, pasando Pipe para stdout. Lea de la tubería que devuelve.

+0

que probablemente debería ser referido como exec.Run() (que devuelve un CMD), en lugar de Cmd .Correr. – esm

+0

Whoops. Gracias. – Glomek

70

hay una manera más fácil ahora:

package main 

import (
    "fmt" 
    "log" 
    "os/exec" 
) 

func main() { 
    out, err := exec.Command("date").Output() 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Printf("The date is %s\n", out) 
} 

Dónde out es la salida standart. Está en el formato []byte, pero se puede cambiar fácilmente a la cadena con:

string(out) 

También se puede utilizar en lugar de CombinedOutput()Output() que devuelve la salida estándar y el error estándar.

+3

Probablemente esta sea la respuesta aceptada ahora. La respuesta aceptada ni siquiera compila más. –

2

Para obtener tanto stdout y stderr en cadenas separadas, puede utilizar tampones de bytes de este modo:

cmd := exec.Command("date") 
var outb, errb bytes.Buffer 
cmd.Stdout = &outb 
cmd.Stderr = &errb 
err := cmd.Run() 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println("out:", outb.String(), "err:", errb.String()) 
Cuestiones relacionadas