Come posso richiamare un comando di sistema e catturarne l'output?


91

C'è un modo per invocare un comando di sistema, come lso fuserin Rust? Che ne dici di catturarne l'output?

Risposte:


119

std::process::Command lo consente.

Esistono diversi modi per generare un processo figlio ed eseguire un comando arbitrario sulla macchina:

  • spawn - esegue il programma e restituisce un valore con i dettagli
  • output - esegue il programma e restituisce l'output
  • status - esegue il programma e restituisce il codice di uscita

Un semplice esempio dalla documentazione:

use std::process::Command;

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

2
E se avessi bisogno di ottenere un output in tempo reale. Penso che la outputfunzione restituisca Vec dopo il completamento del processo. Quindi, nel caso in cui eseguiamo qualcosa di simile Command("ping google.com"). È possibile ottenere l'output di questo comando poiché non finirà, ma voglio stampare i suoi log. Per favore suggerisci.
GrvTyagi

3
@GrvTyagi:, spawnmenzionato in questa risposta, restituisce un Childrisultato con flussi di I / O standard.
Ry-

Partendo da questa eccellente risposta, ho trovato anche questa risposta utile per capire come interagire con stdin / stdout.
Michael Noguera

34

un esempio molto chiaro dai documenti :

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());

8

È davvero possibile! Il modulo pertinente è std::run.

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

ProcessOptions'descrittori di file standard per impostazione predefinitaNone (crea un nuovo pipe), quindi puoi semplicemente usare process.output()(ad esempio) per leggere dal suo output.

Se vuoi eseguire il comando e ottenere tutto il suo output dopo che è stato fatto, c'è wait_with_outputper quello .

Process::new, a partire da ieri, restituisce an Option<Process>invece di a Process, tra l'altro.


31
Per tutti i ricercatori: std :: run è stato rimosso, vedere std::io::processinvece (risposta sotto).
jgillich

2
E ' std::processora come di rustc 1.19.0.
WiSaGaN
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.