在Ruby中检测操作系统

50

有没有一种方法可以在Ruby中检测操作系统?我正在开发一个SketchUp工具,需要检测Mac和Windows。


5
你能给我们更多关于你为什么需要这样做的细节吗?通常,特性检测比全面的操作系统检测更有帮助。 - Pete
4个回答

77
你可以使用os的宝石(gem):
gem install os

然后

require 'os'
OS.linux?   #=> true or false
OS.windows? #=> true or false
OS.java?    #=> true or false
OS.bsd?     #=> true or false
OS.mac?     #=> true or false
# and so on.

参见:https://github.com/rdp/os


2
谢谢你找到了那个。太棒了,回答得好。:) 不幸的是,你有两年的投票要追赶。 - Gerry

60

这是我最近见过的最好的一个。它来自selenium。我认为它之所以是最好的,是因为它使用了rbconfig host_os字段,这具有在MRI和JRuby上工作的优点。无论JRuby运行在哪个主机操作系统上,RUBY_PLATFORM都将显示“java”。您需要稍微调整一下此方法:

  require 'rbconfig'

  def os
    @os ||= (
      host_os = RbConfig::CONFIG['host_os']
      case host_os
      when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
        :windows
      when /darwin|mac os/
        :macosx
      when /linux/
        :linux
      when /solaris|bsd/
        :unix
      else
        raise Error::WebDriverError, "unknown os: #{host_os.inspect}"
      end
    )
  end

不错,但我认为你应该更新你的答案,注明“os”宝石,它已经解决了你提到的JRuby问题,并获取了代码库中的检测代码。参见:https://dev59.com/F2gt5IYBdhLWcg3w0w3B#20579735 - Gerry
如果您无法将 gem 安装到系统中,这也是一个很好的方法。就像我目前正在处理的情况一样,我正在构建一个低级系统脚本,在需要知道操作系统版本的地方没有安装任何东西的访问权限。 <3 - utx0_
请注意,os库的唯一依赖是YAMLRbConfig,它们都是Ruby标准库的一部分。不要考虑打包系统,只需下载并随脚本一起发布os.rb的副本即可。 - undefined

29
你可以使用 puts RUBY_PLATFORM
irb(main):001:0> RUBY_PLATFORM
=> "i686-linux"

但是@Pete是正确的。


只是想让大家知道,如果你在64位Windows上运行32位Ruby,则RUBY_PLATFORM将显示架构为32位。 - max
1
当使用JRuby时,RUBY_PLATFORM将返回"java",无论操作系统如何。 - Roberto Decurnex
这足以用于检测您是否在OSX上。 - Mosselman
@Mosselman 不是这样的。在 macOS 上运行 JRuby 时,你总是会得到 "java" - bfontaine
@Mosselman 你可以使用 RbConfig,参见Thomas的回答 - bfontaine
显示剩余2条评论

4
你可以检查 RUBY_PLATFORM 常量,但在某些情况下这被认为是不可靠的,例如在运行 JRuby 时。其他选项包括捕获 POSIX 系统上 uname -a 命令的输出,或使用诸如 sys-uname 的检测 gem。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接