exec.Cmd.CombinedOutput în Go

Rulează comanda și returnează împreună ieșirea standard și mesajele de eroare (stdout + stderr).

Sintaxă
func (c *Cmd) CombinedOutput() ([]byte, error)

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 CombinedOutput ca date (JSON, CSV). Mesajele de pe stderr se amestecă printre date; pentru date folosește Output.

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.