注意:如果您想到更好的标题/问题,请随时提出建议。我不确定如何用一个简短的句子表达这个问题。
我创建了一个命令行Mastermind游戏。要玩游戏,请在命令行键入play.rb
。
play.rb
是一个启动游戏的Ruby脚本。在脚本中,游戏被发送一个名为CommandLineInterface
的接口。
如果你想使用GUI(我使用名为Limelight的Ruby GUI),你cd
进入limelight
目录并输入limelight open production
并打开GUI。 / p>
有一个mastermind_game
目录,其中包含lib
,spec
和limelight
目录。 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 ...'选择红宝石将不起作用。”
答案 0 :(得分:0)
以下是Google搜索标题的第一个结果:http://tech.natemurray.com/2007/03/ruby-shell-commands.html
如果那不是你需要的,我不明白这个问题。
答案 1 :(得分:0)
反引号:
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。我认为最好只检查一下风头二进制文件是否存在,并告诉用户修复他们的环境,如果不存在的话。