Ruby Language
ऑपरेटिंग सिस्टम या शेल कमांड
खोज…
परिचय
ऑपरेटिंग सिस्टम के साथ बातचीत करने के कई तरीके हैं। रूबी के भीतर से आप शेल / सिस्टम कमांड या सब-प्रोसेस चला सकते हैं।
टिप्पणियों
exec:
Exec कार्यक्षमता में बहुत सीमित है और जब निष्पादित किया जाता है तो रूबी प्रोग्राम से बाहर निकल जाएगा और कमांड चलाएगा।
सिस्टम कमांड:
सिस्टम कमांड वर्तमान प्रक्रिया को बदलने के बजाय एक सब-शेल में चलता है और सही या शून्य रिटर्न करता है। सिस्टम कमांड बैकटिक्स की तरह है, एक ब्लॉकिंग ऑपरेशन जहां मुख्य एप्लिकेशन सिस्टम सिस्टम के परिणाम के पूरा होने तक इंतजार करता है। यहां मुख्य ऑपरेशन को बच्चे की प्रक्रिया से उठाए गए अपवाद पर कब्जा करने के बारे में चिंता करने की आवश्यकता नहीं है।
सिस्टम फ़ंक्शन का आउटपुट हमेशा सही या शून्य होगा, यह इस बात पर निर्भर करता है कि स्क्रिप्ट त्रुटि के बिना निष्पादित की गई है या नहीं। इसलिए, स्क्रिप्ट को निष्पादित करते समय हर त्रुटि हमारे आवेदन को पारित नहीं की जाएगी। मुख्य प्रक्रिया को कभी भी बच्चे की प्रक्रिया से उठाए गए अपवाद को पकड़ने की चिंता करने की आवश्यकता नहीं है। इस मामले में आउटपुट शून्य है क्योंकि बच्चे की प्रक्रिया ने एक अपवाद उठाया।
यह एक अवरुद्ध ऑपरेशन है जहां रूबी कार्यक्रम तब तक इंतजार करेगा जब तक कि जाने से पहले कमांड का संचालन पूरा न हो जाए।
सिस्टम ऑपरेशन वर्तमान प्रक्रिया को कांटा करने के लिए कांटा का उपयोग करता है और फिर निष्पादित का उपयोग करके दिए गए ऑपरेशन को निष्पादित करता है।
बैकटिक्स (`):
बैकटिक कैरेक्टर सामान्य रूप से कीबोर्ड पर एस्केप कुंजी के नीचे स्थित होता है। बैकटिक्स वर्तमान प्रक्रिया को बदलने के बजाय एक उप-शेल में चलता है और कमांड का परिणाम देता है।
यहां हम कमांड का आउटपुट प्राप्त कर सकते हैं लेकिन अपवाद उत्पन्न होने पर प्रोग्राम क्रैश हो जाएगा।
यदि उप-प्रक्रिया में कोई अपवाद है तो वह अपवाद मुख्य प्रक्रिया को दिया जाता है और अपवाद को नियंत्रित न किए जाने पर मुख्य प्रक्रिया समाप्त हो सकती है। यह एक अवरुद्ध ऑपरेशन है जहां रूबी कार्यक्रम तब तक इंतजार करेगा जब तक कि जाने से पहले कमांड का संचालन पूरा न हो जाए।
सिस्टम ऑपरेशन वर्तमान प्रक्रिया को कांटा करने के लिए कांटा का उपयोग करता है और फिर निष्पादित का उपयोग करके दिए गए ऑपरेशन को निष्पादित करता है।
IO.popen:
IO.popen एक उप-प्रक्रिया में चलता है। यहां उप-प्रक्रिया मानक इनपुट और मानक आउटपुट IO ऑब्जेक्ट से जुड़े हैं।
Popen3:
Popen3 आपको मानक इनपुट, मानक आउटपुट और मानक त्रुटि तक पहुंचने की अनुमति देता है।
उपप्रकार का मानक इनपुट और आउटपुट IO ऑब्जेक्ट्स में वापस आ जाएगा।
$? ($ CHILD_STATUS के समान)
बैकटिक्स, सिस्टम () या% x {} संचालन के साथ उपयोग किया जा सकता है और अंतिम सिस्टम निष्पादित कमांड की स्थिति देगा।
यह exitstatus
और pid
गुणों को एक्सेस करने के लिए उपयोगी हो सकता है।
$?.exitstatus
रूबी में शेल कोड निष्पादित करने के अनुशंसित तरीके:
Open3.popen3 या Open3.capture3:
Open3 वास्तव में सिर्फ रूबी की स्पॉन कमांड का उपयोग करता है, लेकिन आपको बहुत बेहतर एपीआई देता है।
Open3.popen3
पॉपेन 3 एक उप-प्रक्रिया में चलता है और स्टडिन, स्टडआउट, स्टडर और प्रतीक्षा_थ्र रिटर्न करता है।
require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5s && ls")
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}"
या
require 'open3'
cmd = 'git push heroku master'
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
puts "stdout is:" + stdout.read
puts "stderr is:" + stderr.read
end
होगा उत्पादन: stdout है: stderr है: घातक: नहीं एक गिट रिपॉजिटरी (या किसी भी मूल निर्देशिका के):
या
require 'open3'
cmd = 'ping www.google.com'
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
while line = stdout.gets
puts line
end
end
उत्पादन होगा:
32 बाइट्स डेटा के साथ www.google.com [216.58.223.36] पिंग करना:
216.58.223.36 से उत्तर दें: बाइट्स = 32 समय = 16ms टीटीएल = 54
216.58.223.36 से उत्तर दें: बाइट्स = 32 समय = 10ms टीटीएल = 54
216.58.223.36 से उत्तर दें: बाइट्स = 32 समय = 21ms टीटीएल = 54
216.58.223.36 से उत्तर दें: बाइट्स = 32 समय = 29ms टीटीएल = 54
216.58.223.36 के लिए पिंग आँकड़े:
पैकेट: भेजा गया = 4, प्राप्त = 4, खोया = 0 (0% हानि),
मिली-सेकंड में अनुमानित दौर यात्रा समय:
न्यूनतम = 10ms, अधिकतम = 29ms, औसत = 19ms
Open3.capture3:
require 'open3'
stdout, stderr, status = Open3.capture3('my_funky_command', 'and', 'some', 'argumants')
if status.success?
# command completed successfully, do some more stuff
else
raise "An error occured"
end
या
Open3.capture3('/some/binary with some args')
हालांकि, अतिरिक्त ओवरहेड और शेल इंजेक्शन की क्षमता के कारण अनुशंसित नहीं है।
यदि कमांड स्टड से पढ़ता है और आप इसे कुछ डेटा खिलाना चाहते हैं:
Open3.capture3('my_funky_command', stdin_data: 'read from stdin')
Chdir का उपयोग करके एक अलग कार्य निर्देशिका के साथ कमांड चलाएँ:
Open3.capture3('my_funky_command', chdir: '/some/directory')
रूबी में शेल कोड निष्पादित करने के क्लैसिक तरीके:
exec:
exec 'echo "hello world"'
या
exec ('echo "hello world"')
सिस्टम कमांड:
system 'echo "hello world"'
कमांड विंडो में आउटपुट "हैलो वर्ल्ड" होगा।
या
system ('echo "hello world"')
यदि आदेश सफल था या नहीं तो सिस्टम कमांड एक सच्चा रिटर्न दे सकता है।
result = system 'echo "hello world"'
puts result # will return a true in the command window
बैकटिक्स (`):
echo "hello world"
कमांड विंडो में "हैलो वर्ल्ड" आउटपुट करेगा।
आप परिणाम को भी पकड़ सकते हैं।
result = `echo "hello world"`
puts "We always code a " + result
IO.popen:
# Will get and return the current date from the system
IO.popen("date") { |f| puts f.gets }