¿Cómo invoco un comando del sistema en Rust y capturo su salida?

87

¿Hay alguna forma de invocar un comando del sistema, como lso fuseren Rust? ¿Qué tal capturar su salida?

quux00
fuente

Respuestas:

115

std::process::Command permite eso.

Hay varias formas de generar un proceso hijo y ejecutar un comando arbitrario en la máquina:

  • spawn - ejecuta el programa y devuelve un valor con detalles
  • output - ejecuta el programa y devuelve la salida
  • status - ejecuta el programa y devuelve el código de salida

Un ejemplo simple de los documentos:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");
talles
fuente
2
¿Qué sucede si necesito obtener una salida en tiempo real? Creo que la outputfunción devuelve Vec después de completar el proceso. Entonces, en caso de que ejecutemos algo como Command("ping google.com"). ¿Es posible obtener esta salida de comandos, ya que no terminará, pero quiero imprimir sus registros? Por favor recomiende.
GrvTyagi
3
@GrvTyagi:, spawnmencionado en esta respuesta, devuelve un Childresultado con flujos de E / S estándar.
Ry-
Partiendo de esta excelente respuesta, también encontré esta respuesta útil para comprender cómo interactuar con stdin / stdout.
Michael Noguera
33

un ejemplo muy claro de los documentos :

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());
Karan Ahuja
fuente
8

¡De hecho es posible! El módulo relevante es std::run.

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

ProcessOptionsLos descriptores de archivo estándar están predeterminados enNone (crear una nueva tubería), por lo que puede usar process.output()(por ejemplo) para leer su salida.

Si desea ejecutar el comando y obtener toda su producción después de que se ha hecho, no hay wait_with_outputde que .

Process::new, a partir de ayer, devuelve an en Option<Process>lugar de a Process, por cierto.

Ry-
fuente
31
Para todos los buscadores: std :: run se ha eliminado, consulte en su std::io::processlugar (respuesta a continuación).
jgillich
2
Ahora es a std::processpartir de rustc 1.19.0.
WiSaGaN