Existe uma maneira de invocar um comando do sistema, como ls
ou fuser
no Rust? Que tal capturar sua saída?
87
std::process::Command
permite isso.
Existem várias maneiras de gerar um processo filho e executar um comando arbitrário na máquina:
spawn
- executa o programa e retorna um valor com detalhesoutput
- executa o programa e retorna a saídastatus
- executa o programa e retorna o código de saídaUm exemplo simples dos documentos:
use std::process::Command;
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
output
função retorna Vec após a conclusão do processo. Portanto, no caso de executarmos algo parecidoCommand("ping google.com")
. É possível obter a saída deste comando, pois ele não vai terminar, mas quero imprimir seus logs. Por favor sugira.spawn
mencionado nesta resposta, retorna umChild
resultado com fluxos de E / S padrão.um exemplo muito claro dos 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());
fonte
Sim, é possível! O módulo relevante é
std::run
.let mut options = std::run::ProcessOptions::new(); let process = std::run::Process::new("ls", &[your, arguments], options);
ProcessOptions
'padrão descritores de arquivo padrão paraNone
(criar um novo tubo), então você pode apenas usarprocess.output()
(por exemplo) para ler a sua saída.Se você deseja executar o comando e obter toda a sua saída depois de concluído, há
wait_with_output
para isso .Process::new
, a partir de ontem, retorna um emOption<Process>
vez de aProcess
, aliás.fonte
std::io::process
invés (resposta abaixo).std::process
partir do rustc 1.19.0.