¿Hay alguna forma de invocar un comando del sistema, como lso fuseren Rust? ¿Qué tal capturar su salida?
87
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 detallesoutput - ejecuta el programa y devuelve la salidastatus - ejecuta el programa y devuelve el código de salidaUn ejemplo simple de los documentos:
use std::process::Command;
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
outputfunción devuelve Vec después de completar el proceso. Entonces, en caso de que ejecutemos algo comoCommand("ping google.com"). ¿Es posible obtener esta salida de comandos, ya que no terminará, pero quiero imprimir sus registros? Por favor recomiende.spawnmencionado en esta respuesta, devuelve unChildresultado con flujos de E / S estándar.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());fuente
¡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 usarprocess.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 enOption<Process>lugar de aProcess, por cierto.fuente
std::io::processlugar (respuesta a continuación).std::processpartir de rustc 1.19.0.