2016-01-27 25 views
6

std::process::Command::spawn aracılığıyla harici bir program yürütmek istiyorum. Dahası, sürecin ortaya çıkmasının neden başarısız olduğunun sebebini bilmek istiyorum: çünkü verilen programın adı/PATH'de değil ya da farklı bir hata yüzünden mi? Ben başarmak istiyorum neBir komutun PATH/yürütülebilir dosyasında olup olmadığını kontrol edin

örnek kod:

Error { repr: Os { code: 2, message: "No such file or directory" } } 

Ama yok:

match Command::new("rustc").spawn() { 
    Ok(_) => println!("Was spawned :)"), 
    Err(e) => { 
     if /* ??? */ { 
      println!("`rustc` was not found! Check your PATH!") 
     } else { 
      println!("Some strange error occurred :("); 
     } 
    }, 
} 

benim sisteminde olmayan bir programı çalıştırmak çalıştığınızda alıyorum Buna güvenmek istiyorum. Bir programın PATH'de olup olmadığını belirleme yolu var mı?

cevap

6

ErrorKind hata mesajını bulmak için e.kind() kullanabilirsiniz.

match Command::new("rustc").spawn() { 
    Ok(_) => println!("Was spawned :)"), 
    Err(e) => { 
     if let NotFound = e.kind() { 
      println!("`rustc` was not found! Check your PATH!") 
     } else { 
      println!("Some strange error occurred :("); 
     } 
    }, 
} 

Düzenleme: hata türlü iade edilebilir hususlar hakkında hiç açık belgeleri bulamadık, bu yüzden kaynak kodunu baktım. Hata, işletim sisteminden düz bir şekilde döndürülmüş gibi görünüyor. İlgili kod src/libstd/sys/[unix/windows/..]/process.rs'da görünüyor. Unix sürümünden bir pasajı:

Bir daha düzenleme: Eğer github

üzerinde görebilmeniz için lisans aslında burada Pas kaynaklarının parçalarını gönderme sağlar eğer bir Düşündüm de, emin değilim Hangi sadece Error::from_raw_os_err(...) döndürür. Windows sürümü daha karmaşık görünüyordu ve hataların nereden geldiğini hemen bulamadım. Her iki durumda da, bu sizin işletim sisteminizin merhametine benziyor. En azından ben src/libstd/process.rs aşağıdaki testi bulundu:

aynı yukarıdaki gibi: github bir ErrorKind::NotFound ikili bulunmazsa, en azından zaman döndürülmesi gereken garanti görünüyor

. İşletim Sisteminin diğer durumlarda bir NotFound hatası vermeyeceğini düşünmek mantıklıdır, ancak kim bilir. Programın gerçekten bulunmadığından kesinlikle emin olmak istiyorsanız, dizinleri elle $ PATH olarak aramak zorundasınız. Şunlar gibi:

use std::env; 
use std::fs; 

fn is_program_in_path(program: &str) -> bool { 
    if let Ok(path) = env::var("PATH") { 
     for p in path.split(":") { 
      let p_str = format!("{}/{}", p, program); 
      if fs::metadata(p_str).is_ok() { 
       return true; 
      } 
     } 
    } 
    false 
} 

fn main() { 
    let program = "rustca"; // shouldn't be found 
    if is_program_in_path(program) { 
     println!("Yes."); 
    } else { 
     println!("No."); 
    } 
} 
+0

Teşekkürler :) Ancak, biraz daha derinlemesine cevap bekledim. İnsan sayfalarına ve/veya diğer belgelere bağlantılar. Benim 'if' koşulu, programın bulunamamış olup olmadığını değerlendirmelidir. Bu dava mı? Hangi hatanın ne zaman döndüğü hakkında daha fazla bilgi var mı? –

+0

PATH ayırıcısı Windows'da '' '! –

+0

@ FrancisGagné ve dizin ayırıcısı '\'. Örneğim gerçekten sadece Unix'ti. Muhtemelen bundan bahsetmeliydim. – jkiiski

İlgili konular