Aucune des réponses fournies ne permet de séparer stdout
y stderr
J'essaie donc une autre réponse.
Tout d'abord, vous obtiendrez toutes les informations dont vous avez besoin en consultant la documentation de l'application exec.Cmd
dans le os/exec
l'emballage. Voir ici : https://golang.org/pkg/os/exec/#Cmd
En particulier les membres Stdin
y Stdout
, Stderr
où tout io.Reader
peut être utilisé pour alimenter stdin
de votre processus nouvellement créé et de tout io.Writer
peut être utilisé pour consommer des stdout
y stderr
de votre commandement.
La fonction Shellout
dans le programme suivant exécutera votre commande et vous donnera sa sortie et la sortie d'erreur séparément sous forme de chaînes de caractères.
Comme la valeur du paramètre est exécutée en tant que commande shell, il convient d'assainir toutes les entrées externes utilisées dans la construction de la valeur du paramètre.
Il est probable qu'il ne soit pas utilisé sous cette forme dans la production.
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
const ShellToUse = "bash"
func Shellout(command string) (string, string, error) {
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd := exec.Command(ShellToUse, "-c", command)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
return stdout.String(), stderr.String(), err
}
func main() {
out, errout, err := Shellout("ls -ltr")
if err != nil {
log.Printf("error: %v\n", err)
}
fmt.Println("--- stdout ---")
fmt.Println(out)
fmt.Println("--- stderr ---")
fmt.Println(errout)
}