用于运行其他ruby脚本的ruby脚本

时间:2015-03-29 09:26:44

标签: ruby shell

如果我想运行一堆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

但没有运气。是吗?

2 个答案:

答案 0 :(得分:4)

您可以使用load运行所需的脚本(loadrequire之间的区别在于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