directorios - ¿Cómo se obtiene la salida de un comando del sistema en Go?
listar directorios powershell (5)
Digamos que quiero ejecutar ''ls'' en un programa go, y almacenar los resultados en una cadena. Parece que hay algunos comandos para bifurcar procesos en los paquetes exec y os, pero requieren argumentos de archivo para stdout, etc. ¿Hay alguna forma de obtener el resultado como una cadena?
Dos opciones, dependiendo del paradigma que prefieras:
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)
}
Donde out
está la salida estándar. Está en el formato []byte
, pero puede cambiarlo a cadena fácilmente con:
string(out)
También puede usar CombinedOutput()
lugar de Output()
que devuelve la salida estándar y el error estándar.
Para obtener tanto stdout como stderr en cadenas separadas, puede usar buffers de bytes como:
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())
Use exec.Run , pasando Pipe para stdout. Lee de la pipa que vuelve.
Use exec.Run especificando Pipe como stdout (y stderr si lo desea). os.File cmd, que contiene un os.File en los campos Stdout (y Stderr). Luego puedes 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))
}
}