Shell script के लिए एक बेहतरीन भाषा, Ruby
(lucasoshiro.github.io)- Ruby को अक्सर Rails framework के साथ ही जोड़ा जाता है, इसलिए इस भाषा की असली खूबियों को कई बार नज़रअंदाज़ कर दिया जाता है
- Ruby एक बहुत समृद्ध और परिपक्व भाषा है, और खासकर जटिल shell script लिखने में उपयोगी है
- इस लेख का उद्देश्य
- shell script लिखते समय काम आने वाली Ruby की सुविधाएँ दिखाना, और Bash तथा Python से तुलना करना
- Bash script को पूरी तरह Ruby script से बदल देना इसका उद्देश्य नहीं है
सुविधा 1: बाहरी command चलाना
- Ruby में बाहरी command चलाने के लिए backtick(```) का उपयोग किया जाता है.
- उदाहरण के लिए, backtick का उपयोग करके बाहरी command का output किसी variable में रखा जा सकता है.
systemयाpopenका भी उपयोग किया जा सकता है.`ls`- command का output variable में रखा जा सकता है.
my_date=`date`
सुविधा 2: status code
$?variable का उपयोग करके आखिरी command का status code देखा जा सकता है- यह Bash से बहुत मिलता-जुलता है
`true` puts $? # 0 `false` puts $? # 1
सुविधा 3: typed language
- Ruby static typed language नहीं है, लेकिन इसमें types होते हैं.
- यह एक object-oriented language है, और इसमें हर चीज़ को object माना जाता है.
- Bash के विपरीत, इसमें string के अलावा दूसरे types भी सुरक्षित रूप से इस्तेमाल किए जा सकते हैं.
total_lines = `wc -l my_file`.to_i # फ़ाइल की पंक्तियों की संख्या वाला integer half = total_lines.div 2 # integer division puts `head -n #{half} my_file` # फ़ाइल का आधा हिस्सा प्रिंट करता है
सुविधा 4: functional composition
- Ruby में
map,select(filter),reduce,flat_mapजैसे functional operations methods के रूप में उपलब्ध हैं. - command output पर
mapलागू किया जा सकता है.puts `ls`.lines.map { |name| name.strip.length } # फ़ाइल नामों की लंबाई प्रिंट करता है
सुविधा 5: regular expression matching
- Ruby में regular expression एक type है, और regex का उपयोग करने वाले operations built-in हैं.
- उदाहरण के लिए, मौजूदा git branch का नाम पाने का तरीका:
current_branch_regex = /^\* (\S+)/ output_lines = `git branch`.lines output_lines.each do |line| if line =~ current_branch_regex # string और regular expression match puts $1 # पहले group का match प्रिंट करता है end end
सुविधा 6: आसान threads
- Ruby में कई threads को संभालना बहुत आसान है
- उदाहरण के लिए, कई फ़ाइलों को एक साथ download करते समय यह उपयोगी है
(1..10).map do |i| # 1 से 10 तक दोहराता है Thread.new do `wget http://my_site.com/file_#{i}` # command के भीतर variable का उपयोग किया जा सकता है end end.each { |thread| thread.join } # do/end और curly braces का उद्देश्य एक ही है
सुविधा 7: built-in file और directory operations
- Ruby में सभी file operations
Fileclass की methods के रूप में, और directory operationsDirclass की methods के रूप में दिए गए हैं. - Python के विपरीत, file और directory को एकसमान तरीके से संभाला जा सकता है.
exists = File.exists? 'My File' # boolean लौटाने वाली methods '?' पर खत्म होती हैं file_content = File.open('My File').read File.delete 'My File' # जब अस्पष्टता न हो तो parentheses वैकल्पिक हैं
निष्कर्ष
- जटिल shell script को बदलने के लिए Ruby पर विचार करने की सिफारिश की जाती है
- इसका मतलब यह नहीं है कि Bash को पूरी तरह छोड़ दिया जाए, लेकिन जटिल कामों में Ruby बेहतर विकल्प हो सकता है
- Python, Perl, JS आदि से भी यह किया जा सकता है, लेकिन व्यक्तिगत रूप से Ruby सबसे अधिक पूर्ण और इस्तेमाल में आसान भाषा लगती है
GN⁺ की राय
- Ruby object-oriented और functional programming दोनों को सपोर्ट करता है, इसलिए यह अलग-अलग programming styles को अपनाने में सक्षम है.
- Python की तुलना में Ruby अधिक सख्त object-oriented paradigm का पालन करता है.
- shell script लिखते समय, जैसे-जैसे जटिलता बढ़ती है, Ruby के फायदे अधिक स्पष्ट होते जाते हैं.
- Ruby की thread handling क्षमता parallel कामों को आसानी से लागू करने में मदद करती है.
- file और directory operations सहज और एकसमान तरीके से उपलब्ध हैं, जिससे productivity बढ़ती है.
3 टिप्पणियां
स्क्रिप्टिंग के लिए इस्तेमाल करें तो भी ठीक ही लगेगा हाहा कौन-सा version है, यह तो नहीं पता, लेकिन Mac में यह डिफ़ॉल्ट रूप से इंस्टॉल होकर आता है ना,,?!
एक समय की मेरी प्रिय Ruby... काश यह इस तरह भी(?) बहुत प्यार पाने वाली भाषा बनी रहे।
Hacker News राय
binding.irbयाbinding.pryका उपयोग करने पर स्क्रिप्ट में interactive debugging किया जा सकता है.Pathnameका उपयोग करने परFileकी तुलना में अधिक natural API मिलता है.Parallelका उपयोग करने पर parallel processing और भी सरल हो जाती है.