Call ruby function from command-line
How can I directly call a ruby function from the command-line?
Imagine, I would have this script test.rb:
class TestClass
def self.test_function(some_var)
puts "I got the following variable: #{some_var}"
end
end
If this script is run from the command-line (ruby test.rb
), nothing happens (as intended).
Is there something like ruby test.rb TestClass.test_function('someTextString')
?
I want to get the following output: I got the following variable: someTextString
.
Solution 1:
First the name of the class needs to start with a capital letter, and since you really want to use a static method, the function name definition needs to start with self.
.
class TestClass
def self.test_function(someVar)
puts "I got the following variable: " + someVar
end
end
Then to invoke that from the command line you can do:
ruby -r "./test.rb" -e "TestClass.test_function 'hi'"
If you instead had test_function
as an instance method, you'd have:
class TestClass
def test_function(someVar)
puts "I got the following variable: " + someVar
end
end
then you'd invoke it with:
ruby -r "./test.rb" -e "TestClass.new.test_function 'hi'"
Solution 2:
Here's another variation, if you find that typing ruby syntax at the command line is awkward and you really just want to pass args to ruby. Here's test.rb:
#!/usr/bin/env ruby
class TestClass
def self.test_function(some_var)
puts "I got the following variable: #{some_var}"
end
end
TestClass.test_function(ARGV[0])
Make test.rb executable and run it like this:
./test.rb "Some Value"
Or run it like this:
ruby test.rb "Some Value"
This works because ruby automatically sets the ARGV
array to the arguments passed to the script. You could use ARGV[0]
or ARGV.first
to get the first argument, or you could combine the args into a single string, separated by spaces, using ARGV.join(' ')
.
If you're doing lots of command-line stuff, you may eventually have a use for Shellwords, which is in the standard ruby lib.