ted
ted

Reputation: 5329

read and execute ruby script

script.rb:

puts 'hello'
puts 'foo'

main.rb:

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

The question:
How can the same be achieved with reading the "script" before execution?

main.rb:

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

Windows and unicode are the reasons of this question;

Please note that `jruby script.rb' creates a new process which is essential.

Upvotes: 0

Views: 308

Answers (3)

James Lim
James Lim

Reputation: 13054

In the command line, using

$ getconf ARG_MAX

will give the upper limit on how many bytes can be used for the command line argument and environment variables.

@Andrew Marshall's answer is better, but suppose you don't want to use a temp file, and assuming we can use 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

Upvotes: 1

Andrew Marshall
Andrew Marshall

Reputation: 96934

Store the modified script in a Tempfile and run that instead of passing the whole contents as an eval argument:

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

The reason you’re likely getting an error is either a lack of proper escaping or a limit on the maximum argument length in the shell.

Also, beware that in your original implementation you never close the original file. I’ve fixed that by instead using IO.read.

Upvotes: 1

MaxKonin
MaxKonin

Reputation: 468

use require

main.rb:

require "script.rb"

Upvotes: 0

Related Questions