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'
创建了一个必不可少的新流程。
答案 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"