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 datOk: programul poate să fi eșuat. Verifică șio.status.success(). - Folosești
output()pentru un program care scrie foarte mult: totul ajunge în memorie. Pentru fluxuri mari, foloseștespawncuStdio::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.