¿Hay alguna forma de invocar un comando del sistema, como ls
o fuser
en 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");
output
funció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.spawn
mencionado en esta respuesta, devuelve unChild
resultado 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);
ProcessOptions
Los 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_output
de que .Process::new
, a partir de ayer, devuelve an enOption<Process>
lugar de aProcess
, por cierto.fuente
std::io::process
lugar (respuesta a continuación).std::process
partir de rustc 1.19.0.