为什么我的代码可以在 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
运行读取文件的子进程是完全没有必要的。
我想对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
运行读取文件的子进程是完全没有必要的。