2016-01-27 15 views
6

के रूप में है, तो मैं std::process::Command::spawn के माध्यम से बाहरी प्रोग्राम निष्पादित करना चाहता हूं। इसके अलावा मैं इस कारण को जानना चाहता हूं कि प्रक्रिया को विफल क्यों किया गया: क्या ऐसा इसलिए है क्योंकि दिया गया प्रोग्राम नाम मौजूद नहीं है/पथ में नहीं है या कुछ अलग त्रुटि के कारण है? मैं क्या हासिल करना चाहते काजांचें कि कोई आदेश PATH/निष्पादन योग्य प्रक्रिया

उदाहरण कोड:

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 :("); 
     } 
    }, 
} 

जब मैं एक प्रोग्राम है जो अपने सिस्टम पर नहीं है पर अमल करने की कोशिश, मैं मिलता है:

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

लेकिन मुझे नहीं पता उस पर भरोसा करना चाहते हैं। क्या यह निर्धारित करने का कोई तरीका है कि पथ में कोई प्रोग्राम मौजूद है या नहीं?

उत्तर

6

आप त्रुटि को खोजने के लिए e.kind() का उपयोग कर सकते हैं।

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 :("); 
     } 
    }, 
} 

संपादित करें: मैं क्या त्रुटि प्रकार लौटाया जा सकता है के बारे में कोई स्पष्ट प्रलेखन नहीं मिला, तो मैं स्रोत कोड ऊपर देखा। ऐसा लगता है कि ओएस से सीधे त्रुटि वापस आती है। प्रासंगिक कोड src/libstd/sys/[unix/windows/..]/process.rs में प्रतीत होता है। यूनिक्स संस्करण से एक टुकड़ा:

एक और संपादित करें: एक दूसरे सोचा पर, मैं अगर लाइसेंस वास्तव में यहाँ जंग स्रोतों के कुछ हिस्सों पोस्टिंग की अनुमति देता है, तो आप github

पर देख सकते हैं यकीन नहीं है जो सिर्फ Error::from_raw_os_err(...) देता है। विंडोज संस्करण अधिक जटिल लग रहा था, और मैं तुरंत यह नहीं ढूंढ सका कि यह त्रुटियों को यहां से लौटाता है। किसी भी तरह से, ऐसा लगता है कि आप इसके बारे में अपने ऑपरेटिंग सिस्टम की दया पर हैं। कम से कम मैं src/libstd/process.rs में निम्न परीक्षण में पाया गया:

उपर्युक्त के समान: github

गारंटी करने के लिए एक ErrorKind::NotFound लौटे दिया जाना चाहिए कि कम से कम जब द्विआधारी नहीं मिला है लगता है। यह समझ में आता है कि ओएस अन्य मामलों में नोटफॉउंड त्रुटि नहीं देगा, लेकिन कौन जानता है। यदि आप पूरी तरह से यह सुनिश्चित करना चाहते हैं कि प्रोग्राम वास्तव में नहीं मिला, तो आपको मैन्युअल रूप से $ PATH में निर्देशिका खोजनी होगी। कुछ ऐसा:

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

धन्यवाद :) हालांकि, मुझे थोड़ी अधिक गहराई से उत्तर देने की उम्मीद है। मैन-पेज और/या अन्य दस्तावेज के लिंक के साथ। अगर मेरी स्थिति में नहीं मिला तो मेरा 'अगर' स्थिति का मूल्यांकन करना चाहिए। क्या यह मामला है? क्या त्रुटि है जब त्रुटि वापस आती है? –

+0

पैथ विभाजक विंडोज़ पर ';' है! –

+0

@ फ्रांसिसगैने और निर्देशिका विभाजक '\'। मेरा उदाहरण वास्तव में केवल यूनिक्स था। शायद इसका उल्लेख किया जाना चाहिए था। – jkiiski

संबंधित मुद्दे