I am a newbie to ruby and want to execute a ruby file that is provided
as input. I want to be able to redirect the output of the execution to a
log file as well.
I am basically looking at executing a test.rb file which could contain
(Sample only)
print "hello world"
sum=2+3
print sum
I tried kernel eval but will need to do this per line and also I am not
able to access sum in the print in 3rd line.
I also tried pipe open but then could not redirect the output to a file.
Hi,
Conrad, I was looking for executing from within a ruby file execution
context and was not able to find good help when I googled for the
information.
Michael, Yes I know what kind of scripts would be provided, they would
be pretty secure
Looks like I can use load 'test.rb' to execute the ruby file from
another ruby program. How do I redirect the output to a file instead of
stdout and stderr?
Conrad, I was looking for executing from within a ruby file execution
context and was not able to find good help when I googled for the
information.
Michael, Yes I know what kind of scripts would be provided, they would
be pretty secure
Looks like I can use load ‘test.rb’ to execute the ruby file from
another ruby program. How do I redirect the output to a file instead of
stdout and stderr?
Thanks,
Sudhindra
Thanks for the replies
Hi, you should be able to do the following:
In file “a”, I have the following:
def a
"Hello, "
end
In file “b”, I have the following:
def b
"my name is "
end
In file “c”, I have the following:
require “a”
require “b”
if FILE == $0
if ARGV.length == 1
puts “#{a}#{b}#{ARGV.first}”
else
puts “Usage: c < your_name >”
end
end
end
ruby c Sudhindra >& file.txt
file.txt contains: Hello, my name is Sudhindra
Lastly, I would recommend reading about global constants in “Programming Ruby 1.8” or “Programming Ruby 1.9”. Also, I would get a good reference on the Unix
>> print "hello world"
> --
another ruby program. How do I redirect the output to a file instead of
stdout and stderr?
Thanks,
Sudhindra
Thanks for the replies
Hi, you should be able to do the following:
In file "a", I have the following:
def a
"Hello, "
end
In file "b", I have the following:
def b
"my name is "
end
In file "c", I have the following:
require "a"
require "b"
if __FILE__ == $0
if ARGV.length == 1
puts "#{a}#{b}#{ARGV.first}"
else
puts "Usage: c < your_name >"
end
end
end
ruby c Sudhindra >& file.txt
file.txt contains: Hello, my name is Sudhindra
Lastly, I would recommend reading about global constants in "Programming
Ruby 1.8" or "Programming Ruby 1.9". Also, I would get a good reference
on
the Unix
command set.
Good luck,
-Conrad
Hi,
May be I am not putting the question right. I want to have editor where
I type in text(Ruby) and that is copied to a temp file for execution.
Now within my editor which is also a ruby script I want to execute this
file. So I call
load 'temp.rb'
The problem is that this program executes fine but I am not able to
capture the output into a file.
Can I do something like
load 'temp.rb >&output.txt ? ( This did not work so what should I do?)
Depending on the needs/requirements of what you're trying to do, you
could probably get away with exec'ing your ruby file in a subshell and
direct output as needed.
Note however that using backtics you can directly capture the output
of what was exec'd in the subshell if you want, instead of writing it
to some file and then reading it back in:
res = `ruby sum.rb 3 4 2>&1`.chomp
=> "3 + 4 = 7"
That said, I second Michael's hope-you-know-what-you're-doing.
Cheers,
Just be VERY VERY careful when using back-ticks or any other form of
Kernel.system().
For instance, since this is a Rails list, I assume you are using,
well, Rails. Suppose you want to pass the input from a form to a
subprocess. If you wrote:
book = params[:book]
cmd = "/usr/local/bin/doit #{book}"
Kernel.system(cmd)
you will have created a machine that will be "pwned" nearly instantly.
A safer, but still not 100% safe, method is to use an array:
cmd = [ "/usr/local/bin/doit", book ]
Kernel.system(*cmd)
Here are some examples of the differences:
=> "/bin/ls `foobar`"
Kernel.system(cmd)
sh: foobar: command not found <-------- NOTE! Security hole!
Compare to:
cmd = ["/bin/ls", "`foobar`" ]
=> ["/bin/ls", "`foobar`"]
Kernel.system(*cmd)
ls: `foobar`: No such file or directory <---- Note (good result)
Just be VERY VERY careful when using back-ticks or any other form of
Kernel.system().
For instance, since this is a Rails list, I assume you are using,
well, Rails. Suppose you want to pass the input from a form to a
subprocess. If you wrote:
book = params[:book]
cmd = "/usr/local/bin/doit #{book}"
Kernel.system(cmd)
you will have created a machine that will be "pwned" nearly instantly.
A safer, but still not 100% safe, method is to use an array:
cmd = [ "/usr/local/bin/doit", book ]
Kernel.system(*cmd)
Here are some examples of the differences:
=> "/bin/ls `foobar`"
Kernel.system(cmd)
sh: foobar: command not found <-------- NOTE! Security hole!
Compare to:
cmd = ["/bin/ls", "`foobar`" ]
=> ["/bin/ls", "`foobar`"]
Kernel.system(*cmd)
ls: `foobar`: No such file or directory <---- Note (good result)
Hi,
Michael, Thanks for the inputs. You are right I am using it within
rails. I dont intend to execute any system commands like ls etc. I would
want to execute ruby script only, like calling some methods, some print
commands and some control structures.
Does kernel.system calls not need a new thread and is it handled in
rails? Also how about using load or popen3? Dont these have any way of
redirecting the output to a file? I am asking a lot of questions but I
am still not clear which is the best method to use for executing the
ruby scripts.