আমি কীভাবে শেল স্ক্রিপ্টিংয়ের জন্য রুবি ব্যবহার করব?


165

আমার কিছু সাধারণ শেল স্ক্রিপ্টিং কাজ রয়েছে যা আমি করতে চাই

উদাহরণস্বরূপ: কিছু নিয়মিত অভিব্যক্তির সাথে মিলে যাওয়া ফাইলগুলির একটি তালিকা থেকে কার্যকরী ডিরেক্টরিতে একটি ফাইল নির্বাচন করা।

আমি জানি যে আমি স্ট্যান্ডার্ড বাশ এবং গ্রেপ ব্যবহার করে এই ধরণের কাজটি করতে পারি তবে আমি দ্রুত ক্রিপ্টগুলি হ্যাক করতে সক্ষম হব যা উইন্ডো এবং লিনাক্সে কাজ করবে আমাকে কমান্ড লাইন প্রোগ্রাম এবং পতাকা ইত্যাদির একটি স্তূপ মুখস্থ না করে

আমি এটি যাবার চেষ্টা করেছিলাম তবে বর্তমান ডিরেক্টরিটির উল্লেখ হিসাবে আমার কোথায় তথ্য পাওয়া উচিত তা সম্পর্কে বিভ্রান্ত হয়ে পড়েছিলাম

সুতরাং প্রশ্নটি হ'ল রুবি গ্রন্থাগারের কোন অংশগুলি রুবি শেল স্ক্রিপ্টগুলি লিখতে আমার জানা দরকার?


3
সম্ভবত একটি ভাল উত্তর না, কিন্তু সিস্টেম প্রশাসনের জন্য ব্যবহারিক রুবি একটি দুর্দান্ত রেফারেন্স। amazon.com/Practical-System-Administration-Experts-Source/dp/...
exiquio

উত্তর:


148

ডিফল্টরূপে, আপনার কাছে ইতিমধ্যে দির এবং ফাইল অ্যাক্সেস রয়েছে , যা তারা নিজেরাই বেশ কার্যকর।

Dir['*.rb'] #basic globs
Dir['**/*.rb'] #** == any depth of directory, including current dir.
#=> array of relative names

File.expand_path('~/file.txt') #=> "/User/mat/file.txt"
File.dirname('dir/file.txt') #=> 'dir'
File.basename('dir/file.txt') #=> 'file.txt'
File.join('a', 'bunch', 'of', 'strings') #=> 'a/bunch/of/strings'

__FILE__ #=> the name of the current file

Stdlib থেকে দরকারী ফাইল ফাইলস

require 'fileutils' #I know, no underscore is not ruby-like
include FileUtils
# Gives you access (without prepending by 'FileUtils.') to
cd(dir, options)
cd(dir, options) {|dir| .... }
pwd()
mkdir(dir, options)
mkdir(list, options)
mkdir_p(dir, options)
mkdir_p(list, options)
rmdir(dir, options)
rmdir(list, options)
ln(old, new, options)
ln(list, destdir, options)
ln_s(old, new, options)
ln_s(list, destdir, options)
ln_sf(src, dest, options)
cp(src, dest, options)
cp(list, dir, options)
cp_r(src, dest, options)
cp_r(list, dir, options)
mv(src, dest, options)
mv(list, dir, options)
rm(list, options)
rm_r(list, options)
rm_rf(list, options)
install(src, dest, mode = <src's>, options)
chmod(mode, list, options)
chmod_R(mode, list, options)
chown(user, group, list, options)
chown_R(user, group, list, options)
touch(list, options)

যা বেশ সুন্দর


110

অন্যরা যেমন ইতিমধ্যে বলেছে, আপনার প্রথম লাইনটি হওয়া উচিত

#!/usr/bin/env ruby

এবং আপনাকে এটিকে এক্সিকিউটেবলও করতে হবে: (শেলের মধ্যে)

chmod +x test.rb

তারপরে রুবি কোড অনুসরণ করে। আপনি যদি একটি ফাইল খুলুন

File.open("file", "r") do |io|
    # do something with io
end

ফাইলটি বর্তমান ডিরেক্টরিতে খোলা আছে যা দিয়ে pwdআপনি শেলটি পেতে পারেন ।

আপনার স্ক্রিপ্টের পথটি পাওয়াও সহজ। আপনার সাথে $0শেলের প্রথম যুক্তি পাওয়া যায় যা আপনার স্ক্রিপ্টের আপেক্ষিক পথ। পরম পথটি এর মতো নির্ধারণ করা যায়:

#!/usr/bin/env ruby
require 'pathname'
p Pathname.new($0).realpath()

ফাইল সিস্টেমের ক্রিয়াকলাপের জন্য আমি প্রায় সর্বদা পথের নাম ব্যবহার করি। এটি অন্যান্য ফাইল সিস্টেম সম্পর্কিত ক্লাসগুলির অনেকের জন্য একটি মোড়ক। এছাড়াও দরকারী: দির, ফাইল ...


66

অন্যান্য উত্তরগুলি থেকে অনুপস্থিত এমন গুরুত্বপূর্ণ কিছু এখানে রয়েছে: কমান্ড-লাইন প্যারামিটারগুলি আপনার রুবি শেল স্ক্রিপ্টকে এআরজিভি (গ্লোবাল) অ্যারের মাধ্যমে উন্মুক্ত করা হবে।

সুতরাং, আপনার যদি আমার_শেল_স্ক্রিপ্ট নামে একটি স্ক্রিপ্ট থাকে:

#!/usr/bin/env ruby
puts "I was passed: "
ARGV.each do |value|
  puts value
end

... এটি সম্পাদনযোগ্য করুন (যেমন অন্যরা উল্লেখ করেছেন):

chmod u+x my_shell_script

এবং এটি যেমন কল:

> ./my_shell_script one two three four five

আপনি এটি পেতে চাই:

I was passed: 
one
two
three
four
five

যুক্তিগুলি ফাইলের নাম সম্প্রসারণের সাথে সুন্দরভাবে কাজ করে:

./my_shell_script *

I was passed: 
a_file_in_the_current_directory
another_file    
my_shell_script
the_last_file

এর বেশিরভাগটি কেবল ইউনিক্স (লিনাক্স, ম্যাক ওএস এক্স) এ কাজ করে তবে আপনি উইন্ডোজে অনুরূপ (কম সুবিধাজনক হলেও) জিনিসগুলি করতে পারেন।


32

এখানে অনেক ভাল পরামর্শ রয়েছে, তাই আমি আরও একটি ছোট্ট যোগ করতে চেয়েছিলাম।

  1. ব্যাকটিকস (বা ব্যাক-টিকস) আপনাকে কিছু স্ক্রিপ্টিং স্টাফ অনেক সহজ করতে দেয়। বিবেচনা

    puts `find . | grep -i lib`
  2. আপনি যদি ব্যাকটিক্সের আউটপুট পেতে সমস্যা নিয়ে চলে যান তবে স্টাফটি স্ট্যান্ডার্ড আউট এর পরিবর্তে স্ট্যান্ডার্ড ভুল হতে চলেছে। এই পরামর্শ ব্যবহার করুন

    out = `git status 2>&1`
  3. ব্যাকটিকগুলি স্ট্রিং ইন্টারপোলেশন করে:

    blah = 'lib'
    `touch #{blah}`
  4. আপনি রুবির ভিতরে পাইপও করতে পারেন । এটি আমার ব্লগের একটি লিঙ্ক, তবে এটি এখানে আবার লিঙ্ক করেছে তাই এটি ঠিক আছে :) এই বিষয়টিতে সম্ভবত আরও উন্নত জিনিস রয়েছে।

  5. অন্যান্য লোকেরা যেমন উল্লেখ করেছে, আপনি যদি গুরুতর হয়ে উঠতে চান তবে সেখানে রাশ রয়েছে: কেবল শেল প্রতিস্থাপন হিসাবে নয় (এটি আমার পক্ষে খানিকটা উগ্র) তবে শেল স্ক্রিপ্ট এবং প্রোগ্রামগুলিতে আপনার ব্যবহারের জন্য একটি গ্রন্থাগার হিসাবেও রয়েছে


ম্যাক-এ, আরও পাওয়ারের জন্য রুবির অভ্যন্তরে অ্যাপ্লিকেশন ব্যবহার করুন। এখানে আমার shell_hereস্ক্রিপ্ট:

#!/usr/bin/env ruby
`env | pbcopy` 
cmd =  %Q@tell app "Terminal" to do script "$(paste_env)"@
puts cmd

`osascript -e "${cmd}"`

তাদের ফর্ম্যাট করার জন্য আমাকে আরও 4 টি স্পেস কোড ইন্ডেন্ট করতে হয়েছিল। আমি ব্যাকটিকগুলিও পিছনে রেখেছি, তবে আমি রুবিকে মোটেও ভাল করে জানি না, তাই আপনি কী চান তা নিশ্চিত করার জন্য আপনি পরীক্ষা করতে চাইবেন।
টিকটিকি

@ টিকটিকাগুলি, হ্যাঁ, এটি আমার 'ট্রিক' দরকার ছিল: ডাবল ইনডেন্ট। সাহায্যের জন্য ধন্যবাদ.
ড্যান রোজনস্টার্ক

1
আমার মনে হয় রাশ মারা গিয়েছে: groups.google.com/group/ruby-shell/browse_thread/thread/…
ড্যান রোজনস্টার্ক

22

যান নিজের একটি কপি পেতে রুবি সঙ্গে দৈনন্দিন স্ক্রিপ্টিং । আপনি যে ধরণের কাজ করতে চান তা কীভাবে করা যায় সে সম্পর্কে এটিতে প্রচুর উপকারী টিপস রয়েছে।


2
ভাল বই, আমি এখনই এটি পড়ছি: এটি একটি জেন ​​কোড ভ্রমণের মতো মনে হচ্ছে। এবং আপনি যদি টিডিডি না জানেন তবে আপনি টিডিডি-র বেসিকগুলি পুরোভাবে শিখবেন।
সাবস্টিয়ান রোকসা সেরেরা

আমি মনে করি বইটিতে কিছু ভাল তথ্য আছে তবে অভিজ্ঞ প্রোগ্রামারদের পক্ষে অনেক বেশি ওভারহেড।
ডি

12

এটি সহায়ক হতে পারে: http://rush.heroku.com/

আমি এটি খুব বেশি ব্যবহার করি নি, তবে দেখতে সুন্দর লাগছে

সাইট থেকে:

রাশ ইউনিক্স শেল (ব্যাশ, জেডএস, ইত্যাদি) এর প্রতিস্থাপন যা খাঁটি রুবি সিনট্যাক্স ব্যবহার করে। ফাইলগুলির মাধ্যমে গ্রেপ করুন, সন্ধান করুন এবং হত্যা প্রক্রিয়াগুলি, ফাইলগুলি অনুলিপি করুন - শেলটিতে আপনি যা কিছু করেন এখন রুবিতে


2
রাশ: না। কেন? groups.google.com/group/ruby- Shell/browse_thread/thread/… এটি দুর্দান্ত তবে চাকাটিতে কেউ নেই।
ড্যান রোজনস্টার্ক

12

আসুন আমরা আপনার script.rbস্ক্রিপ্টটি লিখি বলি । করা:

#!/usr/bin/env ruby

প্রথম লাইন হিসাবে এবং একটি chmod +x script.rb


7

আপনি আরও জটিল রুবি স্ক্রিপ্ট লিখতে চাইলে এই সরঞ্জামগুলি সাহায্য করতে পারে:

উদাহরণ স্বরূপ:

  • থোর (একটি স্ক্রিপ্টিং ফ্রেমওয়ার্ক)

  • gli (ইন্টারফেস মত গিট)

  • মেথডোন (সহজ সরঞ্জাম তৈরি করার জন্য)

তারা আপনাকে আপনার নিজের স্ক্রিপ্টগুলি, বিশেষত 'কমান্ড লাইন অ্যাপ' লেখার জন্য দ্রুত শুরু দেয়।


5

উপরের উত্তরটি আকর্ষণীয় এবং খুব সহায়ক যখন রুবিকে শেল স্ক্রিপ্ট হিসাবে ব্যবহার করে। আমার জন্য, আমি রুবিকে আমার প্রাত্যহিক ভাষা হিসাবে ব্যবহার করি না এবং আমি রুবিকে কেবল প্রবাহ নিয়ন্ত্রণ হিসাবে ব্যবহার করতে পছন্দ করি এবং তবুও কাজগুলি করার জন্য ব্যাশ ব্যবহার করি।

কার্যকরকরণের ফলাফল পরীক্ষার জন্য কিছু সহায়ক ফাংশন ব্যবহার করা যেতে পারে

#!/usr/bin/env ruby
module ShellHelper
  def test(command)
    `#{command} 2> /dev/null`
    $?.success?
  end

  def execute(command, raise_on_error = true)
    result = `#{command}`
    raise "execute command failed\n" if (not $?.success?) and raise_on_error
    return $?.success?
  end

  def print_exit(message)
    print "#{message}\n"
    exit
  end

  module_function :execute, :print_exit, :test
end

সহায়ক সহ, রুবি স্ক্রিপ্টটি একইভাবে বাশ হতে পারে:

#!/usr/bin/env ruby
require './shell_helper'
include ShellHelper

print_exit "config already exists" if test "ls config"

things.each do |thing|
  next if not test "ls #{thing}/config"
  execute "cp -fr #{thing}/config_template config/#{thing}"
end

মানুষ, এই দুর্দান্ত, আপনাকে ধন্যবাদ!
ভিক্টর মার্টিনস

4

"আমি রুবি কীভাবে লিখব" এসও এর সুযোগের বাইরে কিছুটা।

তবে এই রুবি স্ক্রিপ্টগুলি এক্সিকিউটেবল স্ক্রিপ্টগুলিতে রূপান্তর করতে, আপনার রুবি স্ক্রিপ্টের প্রথম লাইন হিসাবে এটি রাখুন:

#!/path/to/ruby

তারপরে ফাইলটি সম্পাদনযোগ্য করুন:

chmod a+x myscript.rb

এবং দূরে আপনি যান।



3

ওয়েবম্যাট দ্বারা উত্তর নিখুঁত। আমি আপনাকে কেবল একটি সংযোজন করতে চাই। আপনার স্ক্রিপ্টগুলির জন্য যদি আপনাকে কমান্ড লাইন প্যারামিটারগুলির সাথে অনেক কিছু করতে হয় তবে আপনার অপ্টপার্স ব্যবহার করা উচিত । এটি সহজ এবং আপনাকে প্রচুর পরিমাণে সহায়তা করে।


3

রুবিতে, ধ্রুবকটি __FILE__আপনাকে সর্বদা চালিত স্ক্রিপ্টের পথ দেয়।

লিনাক্স-এ, /usr/bin/envআপনার বন্ধু:

#! /usr/bin/env ruby
# Extension of this script does not matter as long
# as it is executable (chmod +x)
puts File.expand_path(__FILE__)

.Rb ফাইলগুলি রুবির সাথে যুক্ত কিনা তা উইন্ডোজে এটি নির্ভর করে। যদি তারা:

# This script filename must end with .rb
puts File.expand_path(__FILE__)

যদি তা না হয়, আপনি তাদের উপর সুস্পষ্টভাবে রুবি আহ্বান করতে হবে, আমি একটি মধ্যবর্তী। সিএমডি ফাইল ব্যবহার করব:

my_script.cmd:

@ruby %~dp0\my_script.rb

my_script.rb:

puts File.expand_path(__FILE__)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.