从Ruby代码执行shell命令

时间:2012-09-10 16:54:30

标签: ruby user-interface command-line-arguments

注意:如果您想到更好的标题/问题,请随时提出建议。我不确定如何用一个简短的句子表达这个问题。

我创建了一个命令行Mastermind游戏。要玩游戏,请在命令行键入play.rb

play.rb是一个启动游戏的Ruby脚本。在脚本中,游戏被发送一个名为CommandLineInterface的接口。

如果你想使用GUI(我使用名为Limelight的Ruby GUI),你cd进入limelight目录并输入limelight open production并打开GUI。 / p>

有一个mastermind_game目录,其中包含libspeclimelight目录。 limelight目录包含production目录。

现在我做了一些改变。您可以在命令行将参数传递给脚本。您可以输入play.rb "command line game"play.rb "limelight game"

ARGV是在命令行传递的参数数组。

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

如果我想玩我的命令行游戏,我输入play.rb "command line game"并且它可以正常工作。

我希望能够在命令行输入play.rb "limelight game"并打开GUI。在ARGV中,会找到参数"limelight game",因此interface将设置为LimelightInterface.new。在我的LimelightInterface类中,我想要初始化方法来打开GUI。它本质上应该与在命令行键入limelight open production具有相同的功能。

我不确定这是否可行或如何做,所以任何帮助将不胜感激!谢谢!

已编辑:我正在尝试通过在我的脚本中包含此行来执行命令rvm use jruby

system("rvm use jruby")

我回来了:“RVM不是一个功能,用'rvm use ...'选择红宝石将不起作用。”

2 个答案:

答案 0 :(得分:0)

以下是Google搜索标题的第一个结果:http://tech.natemurray.com/2007/03/ruby-shell-commands.html

如果那不是你需要的,我不明白这个问题。

答案 1 :(得分:0)

Ryan,有几种方法可以呼叫系统:

反引号:     ruby -e 'p ARGV' '1 2' '3 4'#=> “[\”1 2 \“,\”3 4 \“] \ n”

%x文字(请注意,您可以使用任何您喜欢的分隔符,但不限于括号)

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

system命令。这里的区别在于它传递了stdin / out / err。 (上面返回stdout,这个将它打印在你的进程'stdout上)。

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

如果你需要更复杂的用法,stdlib中的open3之类的东西让我相当远。如果你真的需要大枪(​​听起来不像你那样),那就是宝石open4


编辑:

听起来你想做这样的事情:

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]

但老实说,我不认为这对你的情况是一个很好的解决方案,因为有很多合法的方法可以为你的环境设置jruby。我认为最好只检查一下风头二进制文件是否存在,并告诉用户修复他们的环境,如果不存在的话。