Execute shell commands from Ruby code

Note: If you think of a better title/question, feel free to suggest it. I wasn't sure how to articulate this question in one brief sentence.

I created a command line Mastermind game. To play the game, you type play.rb at the command line.

play.rb is a Ruby script that fires up the game. Within the script, the game is sent an interface, called CommandLineInterface.

If you want to play using a GUI (I'm using a Ruby GUI called Limelight), you cd into the limelight directory and type limelight open production and the GUI opens.

There is a mastermind_game directory that contains a lib, a spec, and a limelight directory. The limelight directory contains a production directory.

Now I'm making a few changes. You can pass arguments to the script at the command line. Either you enter play.rb "command line game" or play.rb "limelight game".

ARGV is an array of the arguments passed at the command line.

if ARGV.include?("command line game")
    interface = CommandLineInterface.new
elsif ARGV.include?("limelight game")
    interface = LimelightInterface.new
end

If I want to play my command line game, I enter play.rb "command line game" and it works fine.

I want to be able to type play.rb "limelight game" at the command line and have that open the GUI. In ARGV, the argument "limelight game" would be found so interface would be set to LimelightInterface.new. Within my LimelightInterface class I want the initialize method to open the GUI. It should essentially have the same functionality as typing limelight open production at the command line.

I'm not sure if this is possible or how to do it, so any help would be appreciated! Thanks!

EDITED: I'm trying to execute the command rvm use jruby by including this line in my script:

system("rvm use jruby")

I get back: "RVM is not a function, selecting rubies with 'rvm use ...' will not work."

Answers


Ryan, there's several ways to call out to the system:

Backticks: ruby -e 'p ARGV' '1 2' '3 4' # => "[\"1 2\", \"3 4\"]\n"

The %x literal (note that you can use any delimiter you like, you're not restricted to parentheses)

%x(ruby -e 'p ARGV' '1 2' '3 4') # => "[\"1 2\", \"3 4\"]\n"

The system command. The difference here is that it passes stdin / out / err on through. (the above return the stdout, this one prints it on your process' stdout).

system('ruby', '-e p ARGV', '1 2', '3 4')
# >> ["1 2", "3 4"]

And if you need more sophisticated usage, something like open3 from the stdlib has gotten me pretty far. If you really need the big guns (it doesn't sound like you do), there's a gem open4.


Edit:

It sounds like you're wanting to do something like this:

require 'open3'

bash_script = <<SCRIPT
source "$HOME/.rvm/scripts/rvm"
rvm use jruby
ruby -v
exit
SCRIPT

out, err, status = Open3.capture3 'bash', stdin_data: bash_script
puts out
# >> Using /Users/joshcheek/.rvm/gems/jruby-1.6.7
# >> jruby 1.6.7 (ruby-1.8.7-p357) (2012-02-22 3e82bc8) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_29) [darwin-x86_64-java]

But honestly, I don't think it's a good solution for your situation, because there's many legitimate ways to set up jruby for your environment. I think it would be better to just check that the limelight binary exists, and tell your user to fix their environment if it doesn't.


Here's the first result from googling the title: http://tech.natemurray.com/2007/03/ruby-shell-commands.html

If that's not what you need, I don't understand the question.


Need Your Help

Loading javascript for IE7.. What's my big 'Don't'?

javascript jquery instantiation internet-explorer-7

I started debugging my application in IE7 recently, and noticed a ton of jQuery and javascript is not loading properly. But if I take snippets of the specific function out of my javascript.js file ...

Using ajax request in Django without form element

ajax django decorator

I'd like to send an ajax request (via Jquery, although I think that's irrelevant in this situation) without using a form element in Django. According to the documentation, I should be able to do th...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.