为什么我的代码可以在 irb 中运行,但不能在脚本中运行?

Why does my code work in irb but not from a script?

我想对Redmine日志文件做一些分析,包括之前的日志。所以我想连接 logfile.log.0 和 logfile.log,并一次循环输出一行。我写了下面的代码:

module MyModule
   def analyze_log
     logfile = '/www/redmine/log/logfile.log'
     cat_cmd = "cat #{logfile}.0 #{logfile}"
     cat = IO.popen(cat_cmd)
     cat.readlines do |line|
        puts line
     end
  end
end

当我在 irb 中执行时,代码(没有模块和方法定义)工作完美,但在同一台机器上当我将代码包装在方法中时它不起作用(不打印行)(analyze_log) 在模块 (MyModule) 中,并从脚本中调用它,如下所示:

#!/opt/ruby/bin/ruby
require './my_module'
include MyModule
analyze_log

什么给了?

顺便说一句,如果有更好的方法在同一个循环中顺序处理多个文件,我很乐意听到。但我主要担心的是它在 irb 中有效,但在 运行 作为脚本时无效。

我运行将脚本作为我运行 irb 的同一用户使用。

尝试更改:

cat = IO.popen(cat_cmd)

至:

cat = exec(cat_cmd)

或者将循环更改为遍历这些行:

cat = IO.popen(cat_cmd)
cat.readlines.each {|line| puts line }

你试过这个吗:

module MyModule
   def analyze_log
     logfile = '/www/redmine/log/logfile.log'
     cat_cmd = "cat #{logfile}.0 #{logfile}"
     cat = IO.popen(cat_cmd)
     p cat.readlines
  end
end

我仍然明白为什么会有不同的行为。另外,为什么不使用文件 class 作为文件 IO?

一种更Ruby的方法是使用内部函数来处理:

module MyModule
  def analyze_log
    logfile = '/www/redmine/log/logfile.log'

    [
      "#{logfile}.0",
      logfile
    ].each do |file|
      File.readlines(file).each do |line|
        print line
      end
    end
  end
end

运行读取文件的子进程是完全没有必要的。