यदि आप रूबी से एक्सटर्नल कमांड चलाना चाहते हैं...
...जैसे wkhtmltopdf HTML फाइल को PDF में बदलने के लिए।
कुछ रूबी मेथड्स हैं जिनका आप उपयोग कर सकते हैं।
आप जिस मेथड का उपयोग करते हैं उसके आधार पर आपको अलग-अलग परिणाम मिलेंगे।
आइए इन मेथड्स को एक साथ एक्सप्लोर करते हैं!
रूबी System मेथड
रूबी system मेथड एक्सटर्नल कमांड चलाने का सबसे सरल तरीका है।
यह इस तरह दिखता है:
system("ls")
ध्यान दें कि system कमांड आउटपुट को प्रिंट करेगा जैसा कि यह होता है।
साथ ही system आपके रूबी प्रोग्राम को कमांड पूरा होने तक इंतजार कराएगा।
इसे आज़माएं:
system("sleep 2")
बाद में हम देखेंगे कि कमांड्स को बैकग्राउंड में कैसे चलाया जाए।
System 3 संभावित मान वापस कर सकता है:
trueयदि कमांड काम करता हैfalseयदि कमांड एरर कोड लौटाता हैnilयदि कमांड एक्जीक्यूशन विफल होता है (कमांड नहीं मिला)
आप $? ग्लोबल वेरिएबल के साथ आपके द्वारा चलाई गई अंतिम एक्सटर्नल कमांड का एग्जिट स्टेटस कोड प्राप्त कर सकते हैं। यह स्टेटस कोड आपको इस बारे में अधिक जानकारी दे सकता है कि कमांड क्यों विफल हुआ।
शेल एक्सपेंशन क्या है?
जब आप system के साथ एक्सटर्नल कमांड चलाते हैं तो आपको "शेल एक्सपेंशन" प्रभाव मिलेगा।
शेल एक्सपेंशन तब होता है जब शेल (sh/bash/zsh) आपके कमांड से कुछ विशेष कैरेक्टर्स (*, ?, और [) लेता है और उन्हें फाइल सूची में विस्तारित करता है।
उदाहरण:
system("echo *")
यह वर्तमान डायरेक्टरी में हर फाइल और फोल्डर को प्रिंट करेगा।
* कमांड चलने से पहले फाइलों की सूची से बदल दिया जाता है।
यदि आप इन विशेष कैरेक्टर्स को वैसे ही उपयोग करना चाहते हैं आर्गुमेंट्स को system के दूसरे आर्गुमेंट के रूप में पास करें।
इस तरह:
system("echo", "*")
अब आउटपुट * होगा।
एनवायरनमेंट वेरिएबल्स का उपयोग कैसे करें
यदि आप किसी एक्सटर्नल कमांड को एक विशिष्ट एनवायरनमेंट वेरिएबल पास करना चाहते हैं आप पहले आर्गुमेंट के रूप में हैश का उपयोग कर सकते हैं।
यहाँ एक उदाहरण है:
system({"rubyguides" => "best"}, "ruby", "-e p ENV['rubyguides']")
# "best"
यह आपके रूबी एप्लिकेशन के वर्तमान एनवायरनमेंट को नहीं बदलेगा।
%x / Kernel#`
यदि आप जो कमांड चला रहे हैं उसका आउटपुट प्राप्त करना चाहते हैं, इसे प्रदर्शित करने के बजाय तो आप %x या Kernel#` मेथड का उपयोग कर सकते हैं।
वे वही काम करते हैं।
यहाँ एक उदाहरण है:
`ls`
%x के साथ एक और:
%x|ls|
ये दोनों उदाहरण ls कमांड के आउटपुट के साथ एक स्ट्रिंग लौटाएंगे।
ध्यान दें कि जब तक आप इसे थ्रेड के अंदर नहीं चलाते तब भी आपको कमांड खत्म होने का इंतजार करना होगा।
Fork + Exec का उपयोग करके एक्सटर्नल कमांड्स को अलग प्रोसेस पर चलाएं
फोर्किंग आपके वर्तमान प्रोसेस (आपके रूबी ऐप) की एक कॉपी बनाता है फिर आप exec का उपयोग करके उस कॉपी को दूसरे प्रोसेस से बदल सकते हैं।
नोट: fork मेथड विंडोज पर उपलब्ध नहीं है।
यह यूनिक्स दुनिया में एक लोकप्रिय पैटर्न है।
यहाँ बताया गया है कि यह कैसे काम करता है:
fork { exec("ls") }
यह ls को दूसरे प्रोसेस पर चलाएगा और इसका आउटपुट प्रदर्शित करेगा।
क्योंकि यह कमांड दूसरे प्रोसेस पर चल रहा है यह आपके रूबी ऐप को system मेथड या %x की तरह चलने से ब्लॉक नहीं करेगा।
महत्वपूर्ण:
यदि आप fork के बिना exec का उपयोग करते हैं तो आप अपने वर्तमान प्रोसेस को बदलने जा रहे हैं।
इसका मतलब है कि आपका रूबी प्रोग्राम समाप्त हो जाएगा।
एक्सटर्नल प्रोग्राम के साथ टू-वे कम्युनिकेशन के लिए Popen मेथड का उपयोग कैसे करें
यदि आपको आवश्यकता है:
- प्रोसेस पर अधिक नियंत्रण
- टू-वे कम्युनिकेशन
तब IO.popen मेथड वही है जिसकी आप तलाश कर रहे हैं।
निम्नलिखित उदाहरण में मैं irb प्रोसेस लॉन्च करने के लिए popen मेथड का उपयोग करता हूँ, फिर इसमें कुछ इनपुट भेजता हूँ और आउटपुट पढ़ता हूँ।
यहाँ उदाहरण है:
r = IO.popen("irb", "r+")
r.write "puts 123 + 1\n"
3.times { puts r.gets }
r.write "exit\n"
यह r वेरिएबल एक IO ऑब्जेक्ट है, इसका मतलब है कि आप इससे रेगुलर फाइल की तरह पढ़ और लिख सकते हैं।
popen का उपयोग करने का अर्थ यह भी है कि आपका एक्सटर्नल कमांड अपने स्वयं के प्रोसेस पर चलेगा, इसलिए आपको इसे थ्रेड पर चलाने की आवश्यकता नहीं है।
स्टैंडर्ड लाइब्रेरी में popen3 मेथड भी है।
रेगुलर popen के साथ अंतर यह है कि यह रेगुलर आउटपुट और एरर मैसेजेस को अलग-अलग IO ऑब्जेक्ट्स में विभाजित करेगा।
निष्कर्ष
आपने रूबी में एक्सटर्नल कमांड्स के साथ इंटरैक्ट करने के विभिन्न तरीकों के बारे में सीखा।
इनसे सावधान रहें!
इन कमांड्स में किसी भी प्रकार का उपयोगकर्ता इनपुट पास न करें जब तक कि आप अपने रूबी ऐप में सुरक्षा समस्या नहीं चाहते।
यदि आपने कुछ नया सीखा तो कृपया इस लेख को शेयर करें ताकि अधिक लोग इसे देख सकें।
पढ़ने के लिए धन्यवाद 🙂