Disons que je veux lancer 'ls' dans un programme go, et stocker les résultats dans une chaîne. Il semble y avoir quelques commandes pour les processus fork dans les paquets exec et os, mais ils requièrent des arguments de fichier pour stdout, etc. Y at-il un moyen d'obtenir la sortie sous forme de chaîne?Comment obtenez-vous la sortie d'une commande système dans Go?
Répondre
Utilisation exec.Run en spécifiant Pipe stdout (et stderr si vous voulez). Il renverra cmd, qui contient un os.File dans les champs Stdout (et Stderr). Ensuite, vous pouvez le lire en utilisant par exemple ioutil.ReadAll.
Exemple:
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))
}
}
Deux options, selon le paradigme vous préférez:
Il y a un moyen plus facile maintenant:
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)
}
Où out
est la sortie standart. Il est au format []byte
, mais vous pouvez le changer facilement avec chaîne:
string(out)
Vous pouvez également utiliser CombinedOutput()
au lieu de Output()
qui retourne la sortie standard et l'erreur standard.
Cela devrait probablement être la réponse acceptée maintenant. La réponse acceptée ne compile même plus. –
Pour obtenir à la fois stdout et stderr en chaînes distinctes, vous pouvez utiliser des tampons d'octets comme ceci:
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())
Je ne pense pas que le paquet "exec" existe plus. J'ai dû utiliser "os/exec" comme indiqué par Fatih ci-dessous. –