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

Posted

技术标签:

【中文标题】如何找到我的 Ruby 程序在哪个操作系统上运行?【英文标题】:How can I find which operating system my Ruby program is running on? 【发布时间】:2010-09-15 07:38:03 【问题描述】:

我希望我的 Ruby 程序在 Mac 上和在 Windows 上做不同的事情。如何找出我的程序在哪个系统上运行?

【问题讨论】:

相关:Detecting Linux distribution/platform in Ruby 【参考方案1】:

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

它并不完美,但适用于我进行开发的平台,并且很容易扩展。

【讨论】:

对于 jruby,你最好使用RbConfig::CONFIG["host_os"] 来获取你的操作系统。 是否有任何地方可以将类似的东西打包成一个可以使用的 gem,而不是复制/粘贴之类的?如果有,在哪里? :) 我更喜欢这个而不是任何宝石。 有什么方法可以检查特定版本的 Windows,例如 Windows 8.1? 那个windows变体正则表达式是关闭的顺便说一句,每个名字都应该在括号中的“|”或按预期工作。【参考方案2】:

(警告:阅读@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'时的影响

【讨论】:

在 jruby 上它只报告“java”,所以如果您希望有人运行 jruby,这还不够。【参考方案3】:

要么

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

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

【讨论】:

你不是说Config::CONFIG[‘host_os’]吗? "使用 RbConfig 代替过时和弃用的 Config" => RbConfig::CONFIG["arch"] @jtzero 如果您在 cmets 中提供更完整的答案,我将更新 2008 年编写的答案 在 ruby​​ 1.9.3 (p327) 中它只是那一行,ruby 默认有它irb(main):002:0&gt; require 'rbconfig' =&gt; false 当我这样做的时候,我收到了一份声明说它已经折旧了。 (irb):10:in irb_binding':使用 RbConfig 而不是过时和不推荐使用的 Config。所以我使用了它,RbConfig::CONFIG.each 并列出了所有不同的值。也许你可以在那里找到一些东西来帮助你找到你要找的东西。【参考方案4】:

我有第二个答案,可以添加更多选项。 The os rubygem,他们的github page有相关项目列表。

需要“操作系统” >> OS.windows? => true # 还是 OS.doze? >> 操作系统.bits => 32 >> OS.java? => true # 如果你在 jruby 中运行。还有 OS.jruby? >> OS.ruby_bin => "c:\ruby18\bin\ruby.exe" # 或者 "/usr/local/bin/ruby" 或者什么不是 >> OS.posix? => false # 对于 linux、os x、cygwin 为 true >> OS.mac? # 还是 OS.osx?还是 OS.x? => 假的

【讨论】:

【参考方案5】:

试试 Launchy gem (gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 

【讨论】:

这是 2.1.0 中的 Launchy::Application.new.host_os_family。 仅供参考 -- Launchy 使用 rbconfig: github.com/copiousfreetime/launchy/blob/master/lib/launchy/…【参考方案6】:
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'] ? 实际上在 ruby​​ 2 中应该是RbConfig::Obsolete::CONFIG['host_os'] ...+不需要包含Config 更改 include 或两种类型的模块,然后这是 IMO 的最佳答案。注意他是如何include'd 模块的,所以不需要 RbConfig 或 Config。【参考方案7】:

更新!另外! Rubygems 现在附带Gem.win_platform?

Example usages in the Rubygems repo,还有这个,为了清楚起见:

def self.ant_script
  Gem.win_platform? ? 'ant.bat' : 'ant'
end

【讨论】:

【参考方案8】:

对于在大多数 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) 这些都是 Windows 变体:/cygwin|mswin|mingw|bccwin|wince|emx/ RUBY_ENGINE #=> 例如。 "红宝石", "jruby"

如果您不介意依赖关系并且想要一些对用户更友好的东西,则可以使用库。具体来说,OS 提供了OS.mac?OS.posix? 等方法。 Platform可以很好的区分各种Unix平台。 Platform::IMPL 将返回,例如。 :linux,:freebsd,:netbsd,:hpux。 sys-unamesysinfo 类似。 utilinfo 非常基础,在 Windows、Mac 和 Linux 以外的任何系统上都会失败。

如果您想要具有特定系统详细信息的更高级库,例如不同的 Linux 发行版,请参阅我对 Detecting Linux distribution in Ruby 的回答。

【讨论】:

我欢迎更准确的解释或链接来说明RUBY_PLATFORMRbConfig::CONFIG["host_os"] 的填充方式。看代码,我还是不太清楚。【参考方案9】:

到目前为止,我们使用以下代码做得很好

  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

【讨论】:

【参考方案10】:

当我只需要知道它是 Windows 还是类 Unix 操作系统时,通常就足够了

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

【讨论】:

File::SEPARATOR 在 windows 中给出 /,所以这不起作用 到处都是不好的做法。如果您想知道文件分隔符是什么,请使用File::SEPARATOR。最好像在 Ruby 中开发一样对平台进行鸭式输入。但是,如果您必须知道平台是否是 Windows,请提出问题而不是试图推断它。

以上是关于如何找到我的 Ruby 程序在哪个操作系统上运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 rbenv 在 Ubuntu 21.1 上安装 Ruby 2.3.0?

如何在我的 Ruby on Rails 应用程序上使用 ruby​​ 2.7

如何确定我的 .NET Windows Forms 程序在哪个监视器上运行?

JavaFX:如何知道在哪个系统上运行应用程序? [复制]

如何安装Sass

如何找到我的 Ruby 应用程序中的性能瓶颈?