如何找到我的Ruby程序在哪个操作系统上运行?


Answers:


142

使用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

它不是完美的,但是对于我开发的平台来说效果很好,并且扩展起来也很容易。


8
对于jruby,最好使用RbConfig::CONFIG["host_os"]OS。
FilBot3

2
是否有任何地方可以将类似这样的东西包装成宝石,而不是复制/粘贴等?如果是这样,在哪里?:)
lindes

1
我更喜欢这种宝石。
约翰逊C

有什么方法可以检查特定版本的Windows,例如Windows 8.1?
萨吉德

Windows变体正则表达式已关闭,每个名称应在括号中加“ |” 或按预期工作。
Epigene '17

23

(警告:请阅读@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"

更新会同使用“更新!加成!RubyGems的今天......”,以减轻当Gem::Platform.local.os == 'java'


4
在jruby上,它仅报告“ java”,因此如果您希望有人在运行jruby,这还不够。
Peter Wagenet

17

要么

irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"

要么

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"

1
不是Config::CONFIG[‘host_os’]
Andrew Grimm'4

5
“使用RbConfig代替过时的和过时的Config” =>RbConfig::CONFIG["arch"]
jtzero 2013年

1
@jtzero如果您在评论中提供更完整的答案,我将更新2008
Vinko Vrsalovic

在ruby 1.9.3(p327)的那一行中,ruby默认具有它irb(main):002:0> require 'rbconfig' => false
jtzero 2013年

当我这样做时,我得到一条声明说那已经贬值了。(irb):10:in irb_binding':使用RbConfig而不是过时的和过时的Config。因此我使用了它,RbConfig::CONFIG.each并列出了所有不同的值。也许您可以在其中找到某些东西,以帮助您找到所需的内容。
FilBot3

9

我还有第二个答案,可以为竞争增加更多选择。 os ruby​​gem和他们的github页面具有相关的项目列表。

需要'os'

>> OS.windows?
=> true#或OS.doze?

>> OS.bits
=> 32

>> OS.java?
=> true#如果您在jruby中运行。还有OS.jruby吗?

>> OS.ruby_bin
=>“ c:\ ruby​​18 \ bin \ ruby​​.exe”#或“ / usr / local / bin / ruby​​”或其他

>> OS.posix?
=> false#对于linux,os x,cygwin为true

>> OS.mac?#或OS.osx?或OS.x?
=>错误


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

我猜这应该是case Config::CONFIG['host_os']
相当于

实际上红宝石2应该是RbConfig::Obsolete::CONFIG['host_os'] ... +无需包括Config
equivalent8

更改一个include或两个模块的类型,然后这是IMO的最佳答案。注意他是如何include使用模块的,因此不需要RbConfig或Config。
FilBot3 '16


2

到目前为止,我们在以下代码方面做得很好

  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

0

对于在大多数Ruby安装中易于访问且已为您进行某些处理的东西,我建议以下这些:

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

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

  1. RbConfig::CONFIG["host_os"]#=>例如 的“linux-GNU”(代码12
  2. RbConfig::CONFIG["arch"]#=>例如 “ i686-linux”,“ i386-linux-gnu”(在编译Ruby解释器时作为参数传递)
  3. RUBY_PLATFORM#=>例如 “ i386-linux-gnu”,“ darwin”-注意,在JRuby中这将返回“ java”!代码
    • 这些都是Windows变体: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE#=>例如 “ ruby​​”,“ jruby”

如果您不介意依赖项,并希望它对用户友好一些,那么可以使用库。具体来说,操作系统提供的方法类似于OS.mac?OS.posix?平台可以很好地区分各种Unix平台。Platform::IMPL将返回,例如。:linux,:freebsd,:netbsd,:hpux。sys-unamesysinfo是相似的。utilinfo是非常基础的,在Windows,Mac和Linux之外的任何系统上都会失败。

如果您想要具有特定系统详细信息的更高级的库,例如不同的Linux发行版,请参阅我关于在Ruby中检测Linux发行版的答案。


我欢迎更精确的解释或如何RUBY_PLATFORM或如何RbConfig::CONFIG["host_os"]填充的链接。看代码,对我来说仍然不清楚。
sondra.kinsey,

-6

当我只需要知道它是Windows还是类似Unix的操作系统时,通常足以

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true

1
File :: SEPARATOR在Windows中提供/,所以这不起作用
彼得

3
到处都是坏习惯。如果您想知道文件分隔符是什么,请使用File::SEPARATOR。最好像在Ruby中那样开发平台。但是,如果您必须知道该平台是否为Windows,请提出问题,而不要尝试推断它。
罗宾·多尔蒂
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.