Comment puis-je appeler une commande système dans Rust et capturer sa sortie?

Est-il possible d’invoquer une commande système, comme ls ou fuser dans Rust? Que diriez-vous de capturer sa sortie?

std::process::Command permet cela.

Il existe plusieurs manières de générer un processus enfant et d’exécuter une commande arbitraire sur la machine:

  • spawn – lance le programme et renvoie une valeur avec les détails
  • output – Exécute le programme et renvoie la sortie
  • status – lance le programme et renvoie 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"); 

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: {}", Ssortingng::from_utf8_lossy(&output.stdout)); println!("stderr: {}", Ssortingng::from_utf8_lossy(&output.stderr)); assert!(output.status.success()); 

C’est en effet possible! Le module correspondant est std::run .

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

Les descripteurs de fichier standard de ProcessOptions sont ProcessOptions par défaut sur None (créez un nouveau tube), vous pouvez donc utiliser process.output() (par exemple) pour lire à partir de sa sortie.

Si vous voulez exécuter la commande et obtenir toutes ses sorties une fois cela fait, il y a wait_with_output pour cela .

Process::new , à partir d’hier, renvoie une Option au lieu d’un Process , soit dit en passant.