如何找到运行Ruby程序的操作系统?

时间:2008-10-04 20:36:41

标签: ruby operating-system

我希望我的Ruby程序在Mac上执行与在Windows上不同的操作。如何找出我的程序运行的系统?

10 个答案:

答案 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安装中已经可以轻松访问的东西,已经为您进行了某些处理,我建议这些:

  1. Gem::Platform.local.os#=>例如。 “ mingw32”,“ java”,“ linux”,“ cygwin”,“ aix”,“ dalvik”(code
  2. Gem.win_platform?#=>例如。正确,错误(code

我知道的这些以及所有其他平台检查脚本都是基于解释以下基本变量的:

  1. RbConfig::CONFIG["host_os"]#=>例如。 “ linux-gnu”(代码12
  2. RbConfig::CONFIG["arch"]#=>例如。 “ i686-linux”,“ i386-linux-gnu”(作为parameter when the Ruby interpreter is compiled传递)
  3. RUBY_PLATFORM#=>例如。 “ i386-linux-gnu”,“ darwin”-请注意,这会在JRuby中返回“ java”!code
    • 这些都是Windows变体:/cygwin|mswin|mingw|bccwin|wince|emx/
  4. 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