我希望我的Ruby程序在Mac上执行与在Windows上不同的操作。如何找出我的程序运行的系统?
答案 0 :(得分:133)
使用RUBY_PLATFORM
常量,并可选择将其包装在模块中以使其更友好:
module OS
def OS.windows?
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
end
def OS.mac?
(/darwin/ =~ RUBY_PLATFORM) != nil
end
def OS.unix?
!OS.windows?
end
def OS.linux?
OS.unix? and not OS.mac?
end
def OS.jruby?
RUBY_ENGINE == 'jruby'
end
end
它并不完美,但适用于我开发的平台,并且很容易扩展。
答案 1 :(得分:21)
(警告:阅读@Peter Wagenet的评论) 我喜欢这个,大多数人使用rubygems,它是可靠的,是跨平台的
irb(main):001:0> Gem::Platform.local
=> #<Gem::Platform:0x151ea14 @cpu="x86", @os="mingw32", @version=nil>
irb(main):002:0> Gem::Platform.local.os
=> "mingw32"
更新与"Update! Addition! Rubygems nowadays..."结合使用可缓解Gem::Platform.local.os == 'java'
答案 2 :(得分:16)
无论
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
或
irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
答案 3 :(得分:8)
我有第二个答案,为战斗添加更多选项。 The os rubygem,他们的github page有一个相关的项目列表。
require 'os' >> OS.windows? => true # or OS.doze? >> OS.bits => 32 >> OS.java? => true # if you're running in jruby. Also OS.jruby? >> OS.ruby_bin => "c:\ruby18\bin\ruby.exe" # or "/usr/local/bin/ruby" or what not >> OS.posix? => false # true for linux, os x, cygwin >> OS.mac? # or OS.osx? or OS.x? => false
答案 4 :(得分:6)
尝试Launchy gem (gem install launchy
):
require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
答案 5 :(得分:4)
require 'rbconfig'
include Config
case CONFIG['host_os']
when /mswin|windows/i
# Windows
when /linux|arch/i
# Linux
when /sunos|solaris/i
# Solaris
when /darwin/i
#MAC OS X
else
# whatever
end
答案 6 :(得分:4)
更新!添加! Rubygems现在附带Gem.win_platform?
。
Example usages in the Rubygems repo,为了清楚起见,这个:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
答案 7 :(得分:1)
到目前为止,我们使用以下代码
做得非常好 def self.windows?
return File.exist? "c:/WINDOWS" if RUBY_PLATFORM == 'java'
RUBY_PLATFORM =~ /mingw32/ || RUBY_PLATFORM =~ /mswin32/
end
def self.linux?
return File.exist? "/usr" if RUBY_PLATFORM == 'java'
RUBY_PLATFORM =~ /linux/
end
def self.os
return :linux if self.linux?
return :windows if self.windows?
nil
end
答案 8 :(得分:0)
对于在大多数Ruby安装中已经可以轻松访问的东西,已经为您进行了某些处理,我建议这些:
Gem::Platform.local.os
#=>例如。 “ mingw32”,“ java”,“ linux”,“ cygwin”,“ aix”,“ dalvik”(code)Gem.win_platform?
#=>例如。正确,错误(code)我知道的这些以及所有其他平台检查脚本都是基于解释以下基本变量的:
RbConfig::CONFIG["host_os"]
#=>例如。 “ linux-gnu”(代码1,2)RbConfig::CONFIG["arch"]
#=>例如。 “ i686-linux”,“ i386-linux-gnu”(作为parameter when the Ruby interpreter is compiled传递)RUBY_PLATFORM
#=>例如。 “ i386-linux-gnu”,“ darwin”-请注意,这会在JRuby中返回“ java”!(code)
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
#=>例如。 “ ruby”,“ jruby” 如果您不介意依赖项,并希望它对用户友好一些,那么可以使用库。具体来说, OS 提供了OS.mac?
或OS.posix?
之类的方法。 Platform 可以很好地区分各种Unix平台。 Platform::IMPL
将返回,例如。 :linux,:freebsd,:netbsd,:hpux。 sys-uname 和 sysinfo 类似。 utilinfo 是非常基础的,在Windows,Mac和Linux之外的任何系统上都会失败。
如果您想要具有特定系统详细信息的更高级的库(例如不同的Linux发行版),请参阅我对Detecting Linux distribution in Ruby的回答。
答案 9 :(得分:-6)
当我只需要知道它是Windows还是类Unix操作系统时,通常就足够了
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true