读取并执行ruby脚本

时间:2013-08-05 11:02:14

标签: ruby-on-rails ruby process jruby

script.rb

puts 'hello'
puts 'foo'

main.rb的

puts `jruby script.rb` # receive the expected result

问题:
如何在执行前阅读“脚本”来实现同样的目标?

main.rb的

code=File.open('script.rb', 'r').read.gsub('"', '\"')
# puts `jruby -e '#{code}'` # Does not work for relatively big files;

Windows和unicode就是这个问题的原因;

请注意`jruby script.rb'创建了一个必不可少的新流程。

3 个答案:

答案 0 :(得分:1)

将修改后的脚本存储在Tempfile中并运行该脚本,而不是将整个内容作为eval参数传递:

require 'tempfile'

code = IO.read('script.rb').gsub('"', '\"')

begin
  tempfile = Tempfile.new 'mytempfile'
  f.write code
  f.close
  puts `jruby '#{f.path}'`
ensure
  f.close
  f.unlink
end

您可能遇到错误的原因是缺少正确的转义或限制shell中的最大参数长度。

另外,请注意,在原始实现中,您永远不会关闭原始文件。我已经修改了它,而不是使用IO.read

答案 1 :(得分:1)

在命令行中,使用

$ getconf ARG_MAX

将给出命令行参数和环境变量可以使用的字节数的上限。

@Andrew Marshall的答案更好,但假设您不想使用临时文件,并假设我们可以使用fork in JRuby

require 'ffi'
module Exec
  extend FFI::Library
  ffi_lib FFI::Platform::LIBC
  attach_function :fork, [], :int
end

code = IO.read('script.rb')
pid = Exec.fork
if 0 == pid
  eval code
  exit 0
else
  Process.waitpid pid
end

答案 2 :(得分:0)

使用require

<强> main.rb的:

require "script.rb"