Existe uma maneira de invocar um comando do sistema, como ls
ou fuser
no Rust? Que tal capturar sua saída?
Respostas:
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");
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());
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 usar process.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 em Option<Process>
vez de a Process
, aliás.
std::io::process
invés (resposta abaixo).
std::process
partir do rustc 1.19.0.
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.