Ce face exec.Cmd.CombinedOutput
CombinedOutput colectează într-un singur buffer tot ce scrie comanda, atât pe stdout, cât și pe stderr, în ordinea în care a scris. Este util când vrei să afișezi sau să salvezi tot ce a spus comanda, de exemplu într-un jurnal sau un mesaj de eroare.
Ce returnează
Toată ieșirea (stdout + stderr) și nil, sau ieșirea și eroarea.
Exemple
Exemplul 1: Ieșire și erori împreună
package main
import (
"fmt"
"os/exec"
)
func main() {
script := "echo 'pas 1: copiere'; echo 'avertisment: disc aproape plin' >&2; echo 'pas 2: gata'"
iesire, err := exec.Command("sh", "-c", script).CombinedOutput()
fmt.Print(string(iesire))
fmt.Println("eroare:", err)
}
Rezultat
pas 1: copiere
avertisment: disc aproape plin
pas 2: gata
eroare: <nil>
Exemplul 2: Mesaj complet la eșec
package main
import (
"fmt"
"os/exec"
"strings"
)
func ruleaza(nume string, arg ...string) error {
iesire, err := exec.Command(nume, arg...).CombinedOutput()
if err != nil {
return fmt.Errorf("%s a eșuat (%v): %s", nume, err, strings.TrimSpace(string(iesire)))
}
return nil
}
func main() {
fmt.Println(ruleaza("sh", "-c", "echo ok"))
fmt.Println(ruleaza("sh", "-c", "echo 'nu găsesc baza de date' >&2; exit 2"))
}
Rezultat
<nil>
sh a eșuat (exit status 2): nu găsesc baza de date
Greșeli frecvente
- Parsezi rezultatul lui
CombinedOutputca date (JSON, CSV). Mesajele de pestderrse amestecă printre date; pentru date foloseșteOutput.
Comenzi înrudite
exec.Cmd.Output: Rulează comanda, așteaptă să se termine și returnează ce a scris pe ieșirea standard (stdout).exec.Cmd.Run: Pornește comanda și așteaptă să se termine; returnează eroare dacă nu a pornit sau a ieșit cu cod diferit de 0.exec.Command: Pregătește rularea unui program extern cu argumentele date; programul pornește abia la Run, Output sau Start.