0

脚本.rb

puts 'hello'
puts 'foo'

主.rb

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

问题:
在执行之前阅读“脚本”如何实现同样的效果?

主.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'会创建一个必不可少的新流程。

4

3 回答 3

1

在命令行中,使用

$ getconf ARG_MAX

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

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

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
于 2013-08-05T13:28:36.420 回答
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.

于 2013-08-05T12:41:45.377 回答
0

使用要求

主.rb:

require "script.rb"
于 2013-08-05T11:53:05.297 回答