Bir sistem komutunu nasıl çağırır ve çıktısını alırım?


91

Rust gibi lsveya fuserRust'ta bir sistem komutunu çağırmanın bir yolu var mı ? Çıktısını yakalamaya ne dersiniz?

Yanıtlar:


119

std::process::Command buna izin verir.

Bir alt süreç oluşturmanın ve makinede rastgele bir komutu çalıştırmanın birden çok yolu vardır:

  • spawn - programı çalıştırır ve ayrıntıları içeren bir değer döndürür
  • output - programı çalıştırır ve çıktıyı döndürür
  • status - programı çalıştırır ve çıkış kodunu döndürür

Dokümanlardan basit bir örnek:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");

2
Ya gerçek zamanlı çıktı almam gerekirse. Sanırım outputişlev, işlem tamamlandıktan sonra Vec döndürüyor. Yani, gibi bir şey çalıştırırsak Command("ping google.com"). Bitmeyeceği için bu komutların çıktısını almak mümkün mü, ancak günlüklerini yazdırmak istiyorum. Lütfen önerin.
GrvTyagi

3
@GrvTyagi: spawnBu cevapta bahsedilen, Childstandart I / O akışları ile bir sonuç döndürür .
Ry-

Bu mükemmel cevap kapalı Bina, ben de buldum bu cevabı nasıl etkileşim ile Stdin / stdout'u anlaşılması için yararlı.
Michael Noguera

34

belgelerden çok net bir örnek :

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());

8

Gerçekten mümkün! İlgili modül std::run.

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

ProcessOptionsStandart dosya tanımlayıcıları varsayılan olarakNone (yeni bir kanal oluştur) şeklindedir, bu nedenle process.output()(örneğin) çıktısından okumak için kullanabilirsiniz .

Komutu çalıştırmak ve tamamlandıktan sonra tüm çıktısını almak istiyorsanız, bunun wait_with_outputiçin var .

Process::new, dün itibariyle, bu arada Option<Process>, a yerine bir döndürüyor Process.


31
Tüm arayanlar için: std :: run kaldırıldı, std::io::processonun yerine bakın (aşağıdaki yanıt).
jgillich

2
Bu var std::processrustc 1.19.0 itibariyle artık.
WiSaGaN
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.