Existe-t-il un moyen d'appeler une commande système, comme ls
ou fuser
dans Rust? Que diriez-vous de capturer sa sortie?
87
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 renvoie une valeur avec des détailsoutput
- exécute le programme et renvoie la sortiestatus
- exécute le programme et renvoie le code de sortieUn exemple simple tiré de la documentation:
use std::process::Command;
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
output
fonction renvoie Vec après la fin du processus. Donc, au cas où nous exécutions quelque chose commeCommand("ping google.com")
. Est-ce possible d'obtenir cette sortie de commandes car elle ne se terminera pas, mais je veux imprimer ses journaux. Veuillez suggérer.spawn
mentionné dans cette réponse, renvoie unChild
résultat avec des flux d'E / S standard.un exemple très clair de la documentation :
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());
la source
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
Les descripteurs de fichier standard sont par défautNone
(créer un nouveau tube), vous pouvez donc simplement utiliserprocess.output()
(par exemple) pour lire à partir de sa sortie.Si vous voulez exécuter la commande et obtenir toute sa sortie une fois que c'est fait, il y a
wait_with_output
pour cela .Process::new
, à partir d'hier, renvoie unOption<Process>
au lieu de aProcess
, d'ailleurs.la source
std::io::process
place (réponse ci-dessous).std::process
maintenant à partir de rustc 1.19.0.