exec.Cmd.Output în Go

Rulează comanda, așteaptă să se termine și returnează ce a scris pe ieșirea standard (stdout).

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

Ce face exec.Cmd.Output

Output pornește comanda, colectează tot ce scrie pe stdout și îl returnează ca []byte. Este cel mai simplu mod de a folosi rezultatul unei comenzi în program.

Dacă nu ai setat cmd.Stderr și comanda eșuează, mesajele de eroare ale comenzii sunt păstrate în ExitError.Stderr. Pentru stdout și stderr amestecate, folosește CombinedOutput.

Ce returnează

Ieșirea standard a comenzii și nil, sau ce s-a apucat de colectat și o eroare.

Exemple

Exemplul 1: Sortarea unei liste cu sort

package main

import (
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    cmd := exec.Command("sort")
    cmd.Stdin = strings.NewReader("Timișoara\nBacău\nIași\nArad\n")
    iesire, err := cmd.Output()
    if err != nil {
        fmt.Println("eroare:", err)
        return
    }
    fmt.Print(string(iesire))
}

Rezultat

Arad
Bacău
Iași
Timișoara

Exemplul 2: Mesajul de eroare al comenzii

package main

import (
    "errors"
    "fmt"
    "os/exec"
)

func main() {
    _, err := exec.Command("sh", "-c", "echo 'fișierul de configurare lipsește' >&2; exit 1").Output()
    var ee *exec.ExitError
    if errors.As(err, &ee) {
        fmt.Println("cod:", ee.ExitCode())
        fmt.Printf("stderr: %s", ee.Stderr)
    }
}

Rezultat

cod: 1
stderr: fișierul de configurare lipsește

Exemplul 3: Prelucrarea rezultatului rând cu rând

package main

import (
    "fmt"
    "os"
    "os/exec"
    "strings"
)

func main() {
    for _, n := range []string{"factura1.pdf", "factura2.pdf", "nota.txt"} {
        os.WriteFile(n, nil, 0o644)
    }
    iesire, err := exec.Command("ls").Output()
    if err != nil {
        fmt.Println("eroare:", err)
        return
    }
    for _, rand := range strings.Split(strings.TrimSpace(string(iesire)), "\n") {
        if strings.HasSuffix(rand, ".pdf") {
            fmt.Println("PDF:", rand)
        }
    }
}

Rezultat

PDF: factura1.pdf
PDF: factura2.pdf

Greșeli frecvente

  • Uiți că ieșirea se termină de obicei cu \n. Aplică strings.TrimSpace înainte să compari.
  • Ai setat deja cmd.Stdout și apelezi Output: primești eroarea „Stdout already set”.

Comenzi înrudite

  • exec.Cmd.CombinedOutput: Rulează comanda și returnează împreună ieșirea standard și mesajele de eroare (stdout + stderr).
  • 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.
  • exec.Cmd.StdoutPipe: Returnează un Reader legat de ieșirea comenzii, ca să citești rezultatul pe măsură ce apare.