listar directorios comandos comando basicos go

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?



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