Como invoco um comando do sistema no Rust e captura sua saída?

87

Existe uma maneira de invocar um comando do sistema, como lsou fuserno Rust? Que tal capturar sua saída?

quux00
fonte

Respostas:

115

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 detalhes
  • output - executa o programa e retorna a saída
  • status - executa o programa e retorna o código de saída

Um exemplo simples dos documentos:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");
talles
fonte
2
E se eu precisar de resultados em tempo real. Acho que a outputfunção retorna Vec após a conclusão do processo. Portanto, no caso de executarmos algo parecido Command("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.
GrvTyagi
3
@GrvTyagi:, spawnmencionado nesta resposta, retorna um Childresultado com fluxos de E / S padrão.
Ry-
Com base nessa excelente resposta, também achei essa resposta útil para entender como interagir com stdin / stdout.
Michael Noguera
33

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());
Karan Ahuja
fonte
8

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, wait_with_outputpara isso .

Process::new, a partir de ontem, retorna um em Option<Process>vez de a Process, aliás.

Ry-
fonte
31
Para todos os pesquisadores: std :: run foi removido, veja ao std::io::processinvés (resposta abaixo).
jgillich de
2
Agora é a std::processpartir do rustc 1.19.0.
WiSaGaN