2009-12-09 9 views
19

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

4

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

Je ne pense pas que le paquet "exec" existe plus. J'ai dû utiliser "os/exec" comme indiqué par Fatih ci-dessous. –

2

Utilisez exec.Run, en passant Pipe pour stdout. Lisez depuis le tuyau qu'il retourne.

+0

Cela devrait probablement être appelé exec.Run() (qui retourne un Cmd), plutôt que Cmd .Courir. – esm

+0

Oups. Merci. – Glomek

70

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

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.

+3

Cela devrait probablement être la réponse acceptée maintenant. La réponse acceptée ne compile même plus. –

2

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