[英]Execute shell commands from Ruby code
注意:如果您认为标题/问题更好,请随时提出建议。 我不确定如何用一个简短的句子来表达这个问题。
我创建了一个命令行Mastermind游戏。 要玩游戏,请在命令行中键入play.rb
play.rb
是一个可以启动游戏的Ruby脚本。 在脚本内, CommandLineInterface
游戏发送一个名为CommandLineInterface
的接口。
如果你想使用GUI玩(我使用Ruby的GUI称为Limelight系列),您cd
到limelight
目录和类型limelight open production
和GUI打开。
有一个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
类中,我希望使用initialize方法打开GUI。 它本质上应该具有与在命令行中键入limelight open production
相同的功能。
我不确定这是否可行或如何实现,因此将不胜感激! 谢谢!
编辑:我试图通过在脚本中包含以下行来执行命令rvm use jruby
:
system("rvm use jruby")
我回来了:“ RVM不是功能,选择'rvm use ...'的红宝石将不起作用。”
这是搜索标题的第一个结果: http : //tech.natemurray.com/2007/03/ruby-shell-commands.html
如果那不是您所需要的,我不明白这个问题。
Ryan,有几种方法可以调用系统:
反引号: ruby -e 'p ARGV' '1 2' '3 4'
-e'p ARGV''1 2''3 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继续传递。 (上面的返回标准输出,这将它打印在您的进程的标准输出上)。
system('ruby', '-e p ARGV', '1 2', '3 4')
# >> ["1 2", "3 4"]
而且,如果您需要更复杂的用法, 则来自stdlib的open3之类的东西已经让我走了很多。 如果您真的需要大枪(听起来不像您那样),那么这里提供了一个gem4 。
编辑:
听起来您想做这样的事情:
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。 我认为最好只检查是否存在limelight二进制文件,并告诉用户修复不存在的环境。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.