Existe-t-il un moyen d'appeler une commande système, comme ls
ou fuser
dans Rust? Que diriez-vous de capturer sa sortie?
Réponses:
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");
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());
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 utiliser process.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 un Option<Process>
au lieu de a Process
, d'ailleurs.
std::io::process
place (réponse ci-dessous).
std::process
maintenant à partir de rustc 1.19.0.
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.