Как мне узнать, в какой операционной системе работает моя программа Ruby?


Ответы:


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"]чтобы получить свою ОС.
FilBot3 02

2
Есть ли где-нибудь что-то подобное, упакованное в драгоценный камень, которое можно было бы использовать вместо копирования / вставки или чего-то подобного? Если да, то где? :)
lindes

1
Я предпочитаю это любому драгоценному камню.
C Johnson

Есть ли способ проверить конкретную версию Windows, например Windows 8.1?
Саджид

Это регулярное выражение варианта Windows выключено, каждое имя должно быть в скобках для "|" или работать как положено.
Epigene

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"

update используется вместе с «Обновить! Дополнение! 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’]?
Эндрю Гримм

5
«Использовать RbConfig вместо устаревшего и устаревшего Config» =>RbConfig::CONFIG["arch"]
jtzero

1
@jtzero Если вы дадите более полный ответ в комментариях, я
обновлю

в ruby ​​1.9.3 (p327) это именно та строка, она есть в ruby ​​по умолчаниюirb(main):002:0> require 'rbconfig' => false
jtzero

Когда я это сделал, я получил заявление о том, что это обесценилось. (irb):10:in irb_binding ': используйте RbConfig вместо устаревшего и устаревшего Config. `Итак, я использовал его RbConfig::CONFIG.eachи перечислил все различные значения. Может быть, вы найдете там что-нибудь, что поможет вам найти то, что вы ищете.
FilBot3 02

9

У меня есть второй ответ, чтобы добавить больше возможностей в драку. Os rubygem и их страница на github содержат список связанных проектов.

требовать 'os'

>> OS.windows?
=> true # или OS.doze?

>> OS.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

>> 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']?
эквивалент 8

на самом деле в Ruby 2 это должно быть RbConfig::Obsolete::CONFIG['host_os'] ... + не нужно включатьConfig
эквивалент8

Измените один includeили оба типа модулей, и тогда это лучший ответ ИМО. Обратите внимание на то, как он includeразместил модуль, поэтому не нужно использовать RbConfig или Config.
FilBot3


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" (код 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => например. «i686-linux», «i386-linux-gnu» (передается как параметр при компиляции интерпретатора Ruby )
  3. RUBY_PLATFORM# => например. «i386-linux-gnu», «darwin» - обратите внимание, что это возвращает «java» в JRuby! ( код )
    • Это все варианты Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => например. "рубин", "рубин"

Библиотеки доступны, если вы не возражаете против зависимости и хотите что-то более удобное для пользователя. В частности, ОС предлагает такие методы, как OS.mac?или OS.posix?. Платформа может хорошо различать различные платформы Unix. Platform::IMPLвернется, например. : linux,: freebsd,: netbsd,: hpux. sys-uname и sysinfo похожи. utilinfo очень прост и не работает в любых системах, кроме Windows, Mac и Linux.

Если вам нужны более продвинутые библиотеки с конкретными деталями системы, например, с разными дистрибутивами Linux, см. Мой ответ на определение дистрибутива Linux в Ruby .


Я приветствую более точные объяснения или ссылки на то, как 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 дает / в окнах, поэтому это не работает
Питер

3
Плохая практика повсюду. Если вы хотите узнать, что такое разделитель файлов, используйте File::SEPARATOR. Лучше всего набирать платформу, как при разработке на Ruby. Но если вам нужно знать, является ли платформа Windows, задайте вопрос вместо того, чтобы пытаться вывести его.
Робин Догерти
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.