2011-01-24 18 views
7

क्या रूबी लिपि में "कमांड नहीं मिला" त्रुटि कैप्चर करने का कोई तरीका है? उदाहरण के लिए, दिए गए:रूबी की बैकटिक्स से "कमांड नहीं मिला" त्रुटियों को कैप्चर करना?

output = `foo` 

मैं कैसे जाल स्थिति है जहाँ foo स्थापित नहीं है क्या ज़रूरत है? मुझे उम्मीद थी कि मैं rescue अपवाद कर सकता हूं, लेकिन ऐसा लगता है कि यह 1.8.7 पर काम नहीं कर रहा है। क्या उपप्रजाति को बुलाए जाने का एक अलग तरीका है जो मैं चाहता हूं? या क्या कोई अलग दृष्टिकोण है?

अद्यतन

मेरे क्षमायाचना, मैं एक छिपा आवश्यकता उल्लेख करना भूल गया: मैं पसंद करेंगे कि दुभाषिया (यह संवेदनशील डेटा शामिल कर सकते हैं) उपयोगकर्ता के लिए कमांड लाइन लीक नहीं करता है, इसलिए क्यों अपवाद पकड़ने की विधि को प्राथमिकता दी जाती है। पहली बार इसे छोड़ने के लिए क्षमा करें।

+0

एक रणनीति है कि उपयोगी है जब आप एक विशिष्ट सुविधा की जरूरत है, है प्रीफलाइट-चेक चलाने के लिए, इसे चलाने की कोशिश करने से पहले, सुविधा, या ऐप या कोड को पहले ढूंढें। फ़ाइल के अस्तित्व को देखने के लिए 'कौन सा' foo'' या दो फ़ाइल परीक्षणों का उपयोग करके इसकी निष्पादन योग्यता, आपको बताएगी कि वास्तव में कमांड और असफल होने के बिना आगे बढ़ना सुरक्षित है या नहीं। यह एक बेहतर उपयोगकर्ता अनुभव के लिए बनाता है क्योंकि आप नियंत्रित कर सकते हैं कि आप गुम कार्यक्षमता पर कैसे प्रतिक्रिया करते हैं, और या तो वैकल्पिक मार्ग पर जाएं, या उस उपयोगकर्ता को सूचित करें जिसे आप आगे नहीं बढ़ सकते क्योंकि कुछ गुम है। –

+0

सहमत है, लेकिन 'कौन सा' foo'' क्रॉस-प्लेटफ़ॉर्म नहीं है, और मैं कोशिश करने और त्रुटि को पकड़ने के अलावा इसे करने के लिए क्रॉस-प्लेटफ़ॉर्म तरीका नहीं सोच सकता ... – kfb

उत्तर

13

रिटर्न कोड का उपयोग करें!

irb(main):001:0> `date` 
=> "Mo 24. Jan 16:07:15 CET 2011\n" 
irb(main):002:0> $? 
=> #<Process::Status: pid=11556,exited(0)> 
irb(main):003:0> $?.to_i 
=> 0 
irb(main):004:0> `foo` 
(irb):4: command not found: foo 
=> "" 
irb(main):005:0> $?.to_i 
=> 32512 

http://corelib.rubyonrails.org/classes/Process/Status.html

पुन: निर्देशित STDERR STDOUT करने के लिए आप वापसी मान के रूप में उत्पादन यह सिर्फ बाहर सूजन के बजाय दे देंगे:

irb(main):010:0> `foo 2>&1` 
=> "sh: foo: not found\n" 
irb(main):011:0> $?.to_i 
=> 32512 
+0

धन्यवाद! हालांकि मैं कमांड लाइन को वापस नहीं ले जाने की अतिरिक्त आवश्यकता का उल्लेख करना भूल गया; अगर मैं सही ढंग से समझता हूं तो यह अभी भी कमांड को दिखाएगा कि उपयोगकर्ता को संदेश नहीं मिला है। – kfb

+0

मेरे उत्तर में यह कैसे करें इस पर जोड़ा गया उदाहरण। –

+0

एक आकर्षण की तरह काम करता है! धन्यवाद! – kfb