2012-09-10 172 views
1

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

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

play.rb是启动游戏的Ruby脚本。在脚本中,游戏被发送一个界面,称为CommandLineInterface

如果你想使用GUI玩(我使用Ruby的GUI称为Limelight系列),你cdlimelight目录,然后键入limelight open production和GUI打开。

有一个mastermind_game目录包含lib,一个speclimelight目录。 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使用...' 不管用。”

+0

选择一种Ruby的系统命令不应该是必需的;您可以使用[.rvmrc](http://bre.overnothing.com/workflow/rvmrc/)文件来选择jruby。您可以将您要调用的内容存储在子目录中,并在那里创建一个'.rvmrc'文件。 –

+0

好的,我创建了一个.rvmrc文件来指定我想要使用jruby。所以我所要做的就是将'system(“cd limelight”)'添加到我的脚本中,对吗?只需将'cd'放入目录,.rvmrc文件将运行jruby。我试图做到这一点,但似乎没有成功进入该目录。 – rzv

+0

不,一个'.rvmrc'文件决定*在调用'ruby ...时运行哪个* Ruby,它不会启动Ruby。您需要将cd放入目录,然后启动您的脚本。 –

回答

0

瑞恩,有几种方式来调出该系统:

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

在%×文字(请注意,你可以使用任何你喜欢的分隔符,你不会受限于括号中)

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

system命令。这里的区别是它通过了stdin/out/err。 (上面的返回标准输出,这个打印在你的进程的标准输出)。

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

如果你需要更复杂的使用,像open3从STDLIB已经很远得到了我。如果你真的需要大枪(​​听起来不像你这样),那么就有一颗宝石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。我认为最好是检查一下风向标二进制文件是否存在,并告诉用户如果没有,就修复它们的环境。

+0

谢谢,这很有帮助。我和那些人一起玩,看看我能做什么,我遇到的问题是我不能做shell(“rvm use jruby”)。它回应道:“RVM不是一个函数,选择'rvm use ...'的红宝石将不起作用。”所以我想打电话给我的命令是“风光开放”,但要做到这一点,我首先必须做'rvm use jruby'。不知道如何做到这一点。 – rzv

+0

我发现[this SO post](http:// stackoverflow。com/questions/5792707/can not-change-rvm-gemset-from-shell-script-via-rvm-gemset-use),但我真的不明白他们在那里提供的解决方案。 – rzv

+1

我编辑它以更适合你。 –

0

下面是从谷歌上搜索标题的第一个结果:http://tech.natemurray.com/2007/03/ruby-shell-commands.html

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

+0

是的,最初我的问题并非如此。我很努力地在Google上找到答案,因为我不确定* Google是什么。几次改变问题后,我终于登上了“从Ruby代码执行shell命令”。我刚刚在半小时前注意到这篇文章,所以我现在正在查看它。现在我明白了如何使用一些东西,比如反引号和'system',但是我还没有能够为我的例子工作。 – rzv