【问题标题】:A ruby script to run other ruby scripts运行其他 ruby​​ 脚本的 ruby​​ 脚本
【发布时间】:2015-03-29 21:07:14
【问题描述】:

如果我想运行一堆 ruby​​ 脚本(超级相似,可能将数字更改为命令行参数)并且仍然将它们输出到标准输出,有没有办法做到这一点?

即运行这些的脚本:

               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

但没有运气。对吗?

【问题讨论】:

  • program1 是外部的还是您编写的?如果它是你的,你为什么不简单地要求它并调用它的方法?
  • 我写了program1,但我不想调用它的方法。它作为脚本运行,因此虽然不是非常面向对象,但我只想使用不同的参数运行它。 “主要内容”在任何方法之外运行。
  • 好的。当你说“不走运”时,你能显示你得到的错误吗?

标签: ruby shell


【解决方案1】:

你可以使用load来运行你需要的脚本(loadrequire的区别是require已经加载了脚本就不会再运行了)。

要使每次运行都有不同的参数(假设它们是从 ARGV 变量中读取的),您需要覆盖 ARGV 变量:

(1..6).each do |i|
  ARGV = ["cmd_line_arg_#{i}","cmd_line_arg2"]
  load 'program1.rb'
end

【讨论】:

    【解决方案2】:
    # 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
    

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2013-12-20
      相关资源
      最近更新 更多