रूबी सिस्टम कमांड चेक एग्जिट कोड


106

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

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


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

जवाबों:


166

से प्रलेखन :

trueयदि सिस्टम शून्य शून्य से बाहर निकलने की स्थिति देता है, तो सिस्टम रिटर्न देता है falsenilकमांड निष्पादन विफल होने पर वापस लौटाता है।

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

2
और कैसे एक चर के लिए अपने उत्पादन (बाहर निकलें कोड) पर कब्जा करने के लिए?
ア ッ ク ア

यदि आप रेल कंसोल में हैं, तो इसका परीक्षण करना, बस ध्यान रखें कि आप $ का मूल्य खो सकते हैं? इसलिए आपको इसे अपने REPL कमांड के भाग के रूप में कैप्चर करने की आवश्यकता है [10] pry(main)> system("touch /root/test 2> /dev/null") => false [11] pry(main)> $?.exitstatus => 0 [12] pry(main)> system("touch /root/test 2> /dev/null"); $?.exitstatus => 1
lardcanoe

systemबैकटिक्स, %xऔर execयहां प्रदान की गई एक और उत्कृष्ट तुलना : stackoverflow.com/questions/6338908/…
टॉम हैरिसन

38

मेरे लिए, मैंने शेल कमांड्स को कॉल करने और $ चेक करने के लिए `` का उपयोग करना पसंद किया? प्रक्रिया की स्थिति प्राप्त करने के लिए। द $? एक प्रक्रिया स्थिति ऑब्जेक्ट है, आप इस ऑब्जेक्ट से कमांड की प्रक्रिया की जानकारी प्राप्त कर सकते हैं, जिसमें शामिल हैं: स्थिति कोड, निष्पादन स्थिति, पीआईडी, आदि।

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

   $?.exitstatus => return error code    
   $?.success? => return true if error code is 0, otherwise false
   $?.pid => created process pid

1
रूबोकॉप की मदद से, मुझे पता चला कि इसके लिए पढ़ने योग्य उर्फ $?है$CHILD_STATUS
राजाविरवर्मा

26

systemfalseयदि कमांड में गैर-शून्य निकास कोड है, या nilयदि कोई कमांड नहीं है , तो रिटर्न ।

इसलिये

system( "foo" ) or exit

या

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

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


6

आप अपने systemकॉल के परिणाम को कैप्चर नहीं कर रहे हैं , जो कि परिणाम कोड लौटाया गया है:

exit_code = system("ruby test.rb")

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

popen3आदेश अधिक निम्न स्तर के विस्तार प्रदान करता है।


2
Open3.capture3इस तरह के कार्य के लिए उपयोग करने के लिए एक विशेष रूप से आसान तरीका है।
टिन मैन

6

ऐसा करने का एक तरीका यह है कि उनका उपयोग करके andया उन्हें श्रृंखलाबद्ध किया जाए &&:

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

पहली बार विफल होने पर दूसरी कॉल नहीं चलाई जाएगी।

आप उन्हें if ()कुछ प्रवाह नियंत्रण देने के लिए लपेट सकते हैं :

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

यह अभी तक मैं क्या हासिल करना चाहता हूं, सीधा और स्पष्ट पर्याप्त है। धन्यवाद
mochadwi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.