¿Hay alguna forma de invocar un comando del sistema, como ls
o fuser
en Rust? ¿Qué tal capturar su salida?
Respuestas:
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");
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());
¡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 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_output
de que .
Process::new
, a partir de ayer, devuelve an en Option<Process>
lugar de a Process
, por cierto.
std::io::process
lugar (respuesta a continuación).
std::process
partir de rustc 1.19.0.
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.