如果我想运行一堆ruby脚本(超级类似,可能会将一个数字更改为命令行参数)并仍然将它们输出到stdout,有没有办法做到这一点?
即运行这些脚本的脚本:
ruby program1.rb input_1.txt
ruby program1.rb input_2.txt
ruby program1.rb input_3.txt
喜欢
(1..3).each do |i|
ruby program1.rb input_#{i}'
end
在另一个脚本中,所以我可以运行该脚本并查看所有3次运行的终端输出?
编辑:
我正在努力实施第二高的投票建议答案。
我的program1.rb中没有main函数,而建议的答案有一个。
我试过这个,对于script.rb:
require "program1.rb"
(1..6).each do |i|
driver("cmd_line_arg_#{i}","cmd_line_arg2")
end
但没有运气。是吗?
答案 0 :(得分:4)
您可以使用load
运行所需的脚本(load
和require
之间的区别在于require
如果已经再次运行脚本{}加载)。
要使每次运行具有不同的参数(假设它们是从ARGV变量中读取的),则需要覆盖ARGV变量:
(1..6).each do |i|
ARGV = ["cmd_line_arg_#{i}","cmd_line_arg2"]
load 'program1.rb'
end
答案 1 :(得分:0)
# script_runner.rb
require_relative 'program_1'
module ScriptRunner
class << self
def run
ARGV.each do | file |
SomeClass.new(file).process
end
end
end
end
ScriptRunner.run
# programe_1.rb
class SomeClass
attr_reader :file_path
def initialize(file_path)
@file_path = file_path
end
def process
puts File.open(file_path).read
end
end
执行类似上面显示的代码的操作可以让您运行:
ruby script_runner.rb input_1.txt input_2.txt input_3.txt
- 如果输入文件发生更改,则非常有用。甚至:
ruby script_runner.rb *.txt
如果要在所有文本文件上运行它。或者:
ruby script_runner.rb inputs/*
如果要在特定目录中的所有文件上运行它(在本例中称为“输入”)。
这假设program_1中的内容.rb不仅仅是一个过程代码块,而是提供了一些对象(类),它封装了你想要在每个文件上使用的逻辑,这意味着你可以需要program_1.rb一次然后使用它提供的对象可以多次使用,否则你需要使用#load:
# script_runner.rb
module ScriptRunner
class << self
def run
ARGV.each do | file |
load('program_1.rb', file)
end
end
end
end
ScriptRunner.run
# program_1.rb
puts File.open(ARGV[0]).read