Let's say i have a script:
!#usr/bin/ruby
# step 1
puts "That's first"
# some code
#step 2
puts "That's second"
# some code
Is there a way to pass ARGV to script that will start execution from a specific line (or step, or class, or whatever)?
For example executing $ ruby script.rb -s 2
will start from second step.
I have a thought about parsing the argument with if\else
, but in this case script will become much more complicated and not DRY at all.
Any ideas?
Bad things happen when you use GOTO.
Here's a proposal that could solve your problem in a bit more elegant way :
Define your steps in 'define_steps.rb' :
# define_steps.rb
#####################################################
@steps = []
def step(i, &block)
@steps[i] = block
end
def launch_steps!(min = 0, max = @steps.size - 1)
@steps[min..max].each.with_index(min) do |block, i|
if block
puts "Launching step #{i}"
block.call
end
end
end
#####################################################
step 1 do
puts 'Step 1 with lots of code'
end
step 2 do
puts 'Step 2 with lots of code'
end
step 3 do
puts 'Step 3 with lots of code'
end
step 4 do
puts 'Step 4 with lots of code'
end
Launch them separately with launch_steps.rb
:
# launch_steps.rb
require_relative 'define_steps'
launch_steps!
puts "-----------------"
launch_steps!(2,3)
It outputs :
Launching step 1
Step 1 with lots of code
Launching step 2
Step 2 with lots of code
Launching step 3
Step 3 with lots of code
Launching step 4
Step 4 with lots of code
-----------------
Launching step 2
Step 2 with lots of code
Launching step 3
Step 3 with lots of code
launch_steps!
without parameters runs every defined step, launch_steps!(min,max)
runs every step between min
and max
, launch_steps!(min)
runs step min
and every step after.
Here's a program run_from_line.rb
which accepts three arguments: path and start line, and end line. End line is optional and defaults to -1.
#/usr/bin/env ruby
path = ARGV.shift
program_text = File.readlines(path)
start_line = ARGV.shift.to_i;
end_line = ARGV.shift || '-1'
end_line = end_line.to_i
selected_code = program_text[start_line..end_line].join
eval selected_code
With this script at test.rb
:
puts "line 0"
puts "line 1"
puts "line 2"
Testing:
> ruby run_from_line.rb test.rb 1
line 1
line 2
> ruby run_from_line.rb test.rb 1 1
line 1
If you want to make this a system-wide script, run chmod a+x run_from_line.rb
then sudo mv run_from_line.rb /usr/local/sbin
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With