2013-09-10 4 views
74

मेरे पास रूबी में सिस्टम कॉल का एक गुच्छा है जैसे कि निम्न और मैं अपने एक्जिट कोड को एक साथ जांचना चाहता हूं ताकि मेरी कमांड विफल हो जाए।रूबी सिस्टम कमांड चेक आउट एक्जिट कोड

system("VBoxManage createvm --name test1") 
system("ruby test.rb") 

मैं चाहता हूँ की तरह

system("VBoxManage createvm --name test1", 0) < कुछ - जहां दूसरा पैरामीटर बाहर निकलने के कोड की जाँच करता है और पुष्टि की है कि कि सिस्टम कॉल सफल रहा था, और यदि नहीं, तो यह एक त्रुटि को बढ़ाने या घटाने के बारे में कुछ करना होगा उस तरह।

क्या यह संभव है?

मैंने इस के साथ कुछ करने की कोशिश की है और यह भी काम नहीं करता है।

system("ruby test.rb") 
system("echo $?") 

या

`ruby test.rb` 
exit_code = `echo $?` 
if exit_code != 0 
    raise 'Exit code is not zero' 
end 
+2

[% x का उपयोग कर पकड़ने कमांड लाइन त्रुटियों] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/4771930/catching-command-line-errors-using-x) –

+0

ऊपर में उदाहरण के लिए, 'exit_code' एक स्ट्रिंग होगा - या तो '" 0 \ n "' या '" 1 \ n "', इसलिए' exit_code! = 0' हमेशा सत्य होगा – dgmstuart

उत्तर

129

documentation से:

प्रणाली रिटर्न true अगर आदेश शून्य से बाहर निकलें स्थिति, false गैर शून्य बाहर निकलने की स्थिति के लिए देता है। कमांड निष्पादन विफल होने पर nil देता है।

system("unknown command")  #=> nil 
system("echo foo")   #=> true 
system("echo foo | grep bar") #=> false 

इसके अलावा

कोई त्रुटि स्थिति $? में उपलब्ध है।

system("VBoxManage createvm --invalid-option") 

$?    #=> #<Process::Status: pid 9926 exit 2> 
$?.exitstatus #=> 2 
+1

के लिए सबसे अच्छा नाम नहीं है और इसके चरम पर आउटपुट (बाहर निकलने वाला कोड नहीं) कैप्चर कैसे करें? –

+2

@ एलेक्सेंडर-सुपरर्ट्रैम्प देखें http://stackoverflow.com/q/690151/477037 – Stefan

+0

यदि आप रेल कंसोल में हैं, तो इसका परीक्षण करें, बस ध्यान रखें कि आप $ का मूल्य खो सकते हैं? इसलिए आपको इसे अपने आरईपीएल कमांड '[10] प्राइ (मुख्य)> सिस्टम (" स्पर्श/रूट/टेस्ट 2>/dev/null ") => झूठी [11] pry (मुख्य) के हिस्से के रूप में इसे कैप्चर करने की आवश्यकता है)> $ ?. exitstatus => 0 [12] pry (मुख्य)> सिस्टम ("स्पर्श/रूट/परीक्षण 2>/dev/null"); $ ?. exitstatus => 1' – lardcanoe

21

system रिटर्न false अगर कोई आदेश है अगर आदेश एक गैर शून्य से बाहर निकलें कोड, या nil है।

इसलिए

system("foo") or exit 

या

system("foo") or raise "Something went wrong with foo" 

काम करना चाहिए, और यथोचित संक्षिप्त कर रहे हैं।

5

आप अपने system कॉल, जो जहां परिणाम कोड दिया जाता है है का परिणाम पर कब्जा नहीं कर रहे हैं:

exit_code = system("ruby test.rb") 

याद रखें कि प्रत्येक system कॉल या समकक्ष है, जो बैकटिक-विधि भी शामिल है, एक नया खोल spawns , इसलिए पिछले शैल के पर्यावरण के परिणाम को कैप्चर करना संभव नहीं है। इस मामले में true है यदि सब कुछ काम करता है, nil अन्यथा।

popen3 कमांड अधिक निम्न स्तर का विवरण प्रदान करता है।

+2

['ओपन 3.capture3'] (http://www.ruby-doc.org/stdlib-2.0.0/libdoc/open3/rdoc/Open3.html#method-c-capture3) इस प्रकार के कार्य के लिए उपयोग करने के लिए एक विशेष रूप से आसान तरीका है। –

+2

exit_code शायद – drewish

3

एक तरीका यह है के लिए उन्हें and या && का उपयोग कर श्रृंखला के लिए है: पहले विफल रहता है

system("VBoxManage createvm --name test1") and system("ruby test.rb") 

दूसरी कॉल चलाने नहीं किया जाएगा।

if (
    system("VBoxManage createvm --name test1") && 
    system("ruby test.rb") 
) 
    # do something 
else 
    # do something with $? 
end 
15

मेरे लिए, मैं उपयोग को प्राथमिकता दी `` खोल आदेशों फोन और $ जाँच करने के लिए:

आप एक if() में उन आप कुछ प्रवाह नियंत्रण देने के लिए लपेट कर सकते हैं? प्रक्रिया की स्थिति प्राप्त करने के लिए। $? एक प्रक्रिया स्थिति वस्तु है, आप इस ऑब्जेक्ट से कमांड की प्रक्रिया जानकारी प्राप्त कर सकते हैं, जिसमें निम्न शामिल हैं: स्टेटस कोड, निष्पादन स्थिति, पिड इत्यादि।

$ के कुछ उपयोगी तरीके? वस्तु:

$?.exitstatus => return error code  
    $?.success? => return true if error code is 0, otherwise false 
    $?.pid => created process pid 
संबंधित मुद्दे