Bagaimana cara menjalankan perintah sistem dan menangkap outputnya?

91

Apakah ada cara untuk menjalankan perintah sistem, seperti lsatau fuserdi Rust? Bagaimana dengan menangkap hasilnya?

quux00
sumber

Jawaban:

119

std::process::Command memungkinkan untuk itu.

Ada beberapa cara untuk menelurkan proses turunan dan menjalankan perintah arbitrer di mesin:

  • spawn - menjalankan program dan mengembalikan nilai dengan detail
  • output - menjalankan program dan mengembalikan hasilnya
  • status - menjalankan program dan mengembalikan kode keluar

Satu contoh sederhana dari dokumen:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");
talles
sumber
2
Bagaimana jika saya perlu mendapatkan hasil real-time. Saya pikir outputfungsi mengembalikan Vec setelah proses selesai. Jadi, jaga-jaga jika kita menjalankan sesuatu seperti Command("ping google.com"). Apakah ini mungkin untuk mendapatkan keluaran perintah ini karena tidak akan selesai tetapi saya ingin mencetak lognya. Mohon saran.
GrvTyagi
3
@GrvTyagi:, spawndisebutkan dalam jawaban ini, menampilkan Childhasil dengan aliran I / O standar.
Ry-
Membangun dari jawaban yang luar biasa ini, saya juga menemukan jawaban ini berguna untuk memahami bagaimana berinteraksi dengan stdin / stdout.
Michael Noguera
34

contoh yang sangat jelas dari dokumen :

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
sumber
8

Itu memang mungkin! Modul yang relevan adalah std::run.

let mut options = std::run::ProcessOptions::new();
let process = std::run::Process::new("ls", &[your, arguments], options);

ProcessOptions'deskriptor file standar default keNone (buat pipa baru), jadi Anda bisa menggunakan process.output()(misalnya) untuk membaca dari outputnya.

Jika Anda ingin menjalankan perintah dan mendapatkan semua outputnya setelah selesai, ada wait_with_outputuntuk itu .

Process::new, seperti kemarin, mengembalikan Option<Process>bukan a Process, omong-omong.

Ry-
sumber
31
Untuk semua pencari: std :: run telah dihapus, lihat std::io::processsaja (jawaban di bawah).
jgillich
2
Ini std::processsekarang seperti dari rustc 1.19.0.
WiSaGaN