web-dev-qa-db-fra.com

Comment invoquer une commande système dans Rust et capturer sa sortie?

Existe-t-il un moyen d'invoquer une commande système, comme ls ou fuser dans Rust? Que diriez-vous de capturer sa sortie?

56
quux00

std::process::Command permet cela.

Il existe plusieurs façons de générer un processus enfant et d'exécuter une commande arbitraire sur la machine:

  • spawn - exécute le programme et retourne une valeur avec des détails
  • output - exécute le programme et retourne la sortie
  • status - exécute le programme et retourne le code de sortie

Un exemple simple de la documentation:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");
86
talles

un exemple très clair de la docs :

use std::process::Command;
let output = Command::new("/bin/cat")
                     .arg("file.txt")
                     .output()
                     .expect("failed to execute process");

println!("status: {}", output.status);
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));

assert!(output.status.success());
13
Karan Ahuja

C'est en effet possible! Le module pertinent est std::run .

let mut options = std::run::ProcessOptions::new();
let process = std::run::Process::new("ls", &[your, arguments], options);

ProcessOptions 'descripteurs de fichiers standard par défaut à None (créer un nouveau canal), vous pouvez donc simplement utiliser process.output() = (par exemple) pour lire sa sortie.

Si vous voulez exécuter la commande et obtenir toute sa sortie une fois terminée, il y a wait_with_output Pour cela .

Process::new, Hier, renvoie un Option<Process> Au lieu d'un Process, soit dit en passant.

6
Ry-