Command::output în Rust

Rulează programul, așteaptă să termine și returnează codul de ieșire și tot ce a scris pe stdout și stderr.

Sintaxă
fn output(&mut self) -> io::Result<Output>

struct Output { status: ExitStatus, stdout: Vec<u8>, stderr: Vec<u8> }

Ce face Command::output

output() pornește procesul, așteaptă terminarea și strânge ieșirile lui. Primești un Output cu trei câmpuri: status (cum s-a terminat), stdout și stderr (octeții scriși, ca Vec<u8>). Textul îl obții cu String::from_utf8_lossy(&o.stdout).

output() returnează Ok chiar dacă programul s-a terminat cu eroare; Err apare doar dacă procesul nu a putut fi pornit. Verifică mereu status.success() sau status.code().

Ce returnează

io::Result<Output>.

Exemple

Exemplul 1: Ieșire, erori și cod de ieșire

Scriptul scrie pe ambele ieșiri și se termină cu codul 3.

use std::process::Command;

fn main() -> std::io::Result<()> {
    let o = Command::new("sh")
        .args(["-c", "echo 'am procesat 12 fișiere'; echo 'lipsește config.ini' >&2; exit 3"])
        .output()?;

    println!("succes: {}", o.status.success());
    println!("cod: {:?}", o.status.code());
    println!("status: {}", o.status);
    println!("stdout: {:?}", String::from_utf8_lossy(&o.stdout));
    println!("stderr: {:?}", String::from_utf8_lossy(&o.stderr));
    Ok(())
}

Rezultat

succes: false
cod: Some(3)
status: exit status: 3
stdout: "am procesat 12 fișiere\n"
stderr: "lipsește config.ini\n"

Exemplul 2: Folosirea rezultatului unei comenzi

Numărăm liniile unui fișier cu programul wc și transformăm răspunsul în număr.

use std::fs;
use std::process::Command;

fn main() -> std::io::Result<()> {
    fs::write("elevi.txt", "Ana\nMihai\nIoana\nRadu\n")?;
    let o = Command::new("wc").args(["-l", "elevi.txt"]).output()?;
    let text = String::from_utf8_lossy(&o.stdout);
    let linii: usize = text.split_whitespace().next().and_then(|n| n.parse().ok()).unwrap_or(0);
    println!("elevi.txt are {linii} linii");
    Ok(())
}

Rezultat

elevi.txt are 4 linii

Greșeli frecvente

  • Verifici doar că output() a dat Ok: programul poate să fi eșuat. Verifică și o.status.success().
  • Folosești output() pentru un program care scrie foarte mult: totul ajunge în memorie. Pentru fluxuri mari, folosește spawn cu Stdio::piped() și citește treptat.

Comenzi înrudite

  • Command: Pornește alt program (proces copil): new() alege programul, arg() și args() adaugă argumente.
  • Command::status: Rulează programul, îl lasă să scrie direct în terminal și returnează doar felul în care s-a terminat.
  • Command::spawn: Pornește programul și returnează imediat un Child, fără să aștepte; poți comunica cu el și îl aștepți mai târziu.
  • process::exit: Oprește imediat programul cu codul de ieșire dat (0 = succes, altceva = eroare), fără să mai ruleze restul codului.