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

Я хочу, чтобы моя программа на Ruby делала на Mac разные вещи, чем на Windows. Как я могу узнать, в какой системе работает моя программа?


person Community    schedule 04.10.2008    source источник
comment
Связано: Обнаружение дистрибутива/платформы Linux в Ruby   -  person sondra.kinsey    schedule 14.03.2019


Ответы (10)


Используйте константу 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

Он не идеален, но хорошо работает для платформ, на которых я занимаюсь разработкой, и его достаточно легко расширять.

person Aaron Hinni    schedule 04.10.2008
comment
для jruby вам лучше использовать RbConfig::CONFIG["host_os"] для получения вашей ОС. - person FilBot3; 02.12.2013
comment
Есть ли где-нибудь, где что-то подобное упаковано в драгоценный камень, который можно было бы использовать вместо копирования/вставки или чего-то подобного? Если да, то где? :) - person lindes; 22.12.2013
comment
Я предпочитаю это любому камню. - person C Johnson; 03.05.2016
comment
Можно ли как-то проверить конкретную версию Windows, например Windows 8.1? - person Sajid; 30.09.2016
comment
Кстати, это регулярное выражение для Windows отключено, каждое имя должно быть заключено в круглые скобки для | или работать как положено. - person Epigene; 03.09.2017
comment
Как я могу получить это, чтобы идентифицировать freebsd против linux? - person Michael Dorst; 01.10.2019
comment
Как узнать точное название ОС и ее версию? Например, Centos 7.5 или RedHat 7.8? Пожалуйста, предложите. - person NN796; 01.07.2020

(Предупреждение: прочитайте комментарий @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'

person jtzero    schedule 16.10.2013
comment
В jruby он просто сообщает о java, поэтому этого недостаточно, если вы ожидаете, что кто-то будет запускать jruby. - person Peter Wagenet; 14.11.2013

Либо

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

or

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
person Vinko Vrsalovic    schedule 04.10.2008
comment
Вы имеете в виду Config::CONFIG[‘host_os’]? - person Andrew Grimm; 23.04.2010
comment
Используйте RbConfig вместо устаревшего и устаревшего Config =› RbConfig::CONFIG["arch"] - person jtzero; 16.10.2013
comment
@jtzero Если вы предоставите более полный ответ в комментариях, я обновлю ответ, написанный в 2008 году. - person Vinko Vrsalovic; 17.10.2013
comment
в ruby ​​1.9.3 (p327) это именно та строка, в ruby ​​по умолчанию она есть irb(main):002:0> require 'rbconfig' => false - person jtzero; 18.10.2013
comment
Когда я это сделал, я получил заявление о том, что он обесценился. (irb):10:in irb_binding': используйте RbConfig вместо устаревшего и устаревшего Config.` Так что я использовал это, RbConfig::CONFIG.each и перечислил все различные значения. Возможно, вы сможете найти там что-то, что поможет вам найти то, что вы ищете. - person FilBot3; 02.12.2013
comment
RUBY_PLATFORM в порядке. Из Config::CONFIG надежно работают только target_os и host_os. Как и в случае с jruby, только они указывают на linux. - person akostadinov; 13.06.2015

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

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
person jtzero    schedule 13.01.2014

Попробуйте драгоценный камень Launchy (gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
person Ryan McGeary    schedule 05.10.2008
comment
Это Launchy::Application.new.host_os_family в 2.1.0. - person fakeleft; 18.01.2013
comment
К сведению: Launchy использует rbconfig: github.com/copiousfreetime /launchy/blob/master/lib/launchy/ - person codecraig; 27.02.2013

Обновить! Дополнение! В настоящее время Rubygems поставляется с Gem.win_platform?< /а>.

Пример использования в репозитории Rubygems, и этот, для ясности:

def self.ant_script
  Gem.win_platform? ? 'ant.bat' : 'ant'
end
person olleolleolle    schedule 03.12.2016

До сих пор у нас неплохо получалось со следующим кодом

  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
person adamliesko    schedule 19.01.2016

Для чего-то легко доступного в большинстве инсталляций Ruby, которое уже несколько обработано для вас, я рекомендую следующее:

  1. Gem::Platform.local.os #=> например. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" (код)
  2. Gem.win_platform? #=> например. true, false (код)

И этот, и любой другой скрипт проверки платформы, который я знаю, основан на интерпретации этих базовых переменных:

  1. RbConfig::CONFIG["host_os"] #=> например. "linux-gnu" (код 1, 2)
  2. RbConfig::CONFIG["arch"] #=> например. "i686-linux", "i386-linux-gnu" (передается как параметр при компиляции интерпретатора Ruby)
  3. RUBY_PLATFORM #=> eg. "i386-linux-gnu", "darwin" - Note that this returns "java" in JRuby! (code)
    • These are all Windows variants: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE #=> например. "руби", "джруби"

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

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

person sondra.kinsey    schedule 14.03.2019
comment
Я приветствовал бы более точные объяснения или ссылки на то, как заполняются RUBY_PLATFORM или RbConfig::CONFIG["host_os"]. Глядя на код, мне все еще не ясно. - person sondra.kinsey; 14.03.2019

Когда мне просто нужно знать, Windows это или Unix-подобная ОС, часто бывает достаточно

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
person dimus    schedule 27.09.2013
comment
File::SEPARATOR дает / в окнах, так что это не работает - person peter; 12.04.2014
comment
Плохая практика повсюду. Если вы хотите узнать, что такое разделитель файлов, используйте File::SEPARATOR. Лучше всего не использовать платформу, как при разработке на Ruby. Но если вам нужно знать, является ли платформа Windows, задайте вопрос, а не пытайтесь сделать вывод. - person Robin Daugherty; 20.07.2014

person    schedule
comment
Я думаю, это должно быть case Config::CONFIG['host_os'] ? - person equivalent8; 05.03.2015
comment
на самом деле в ruby ​​2 это должно быть RbConfig::Obsolete::CONFIG['host_os'] ...+ не нужно включать Config - person equivalent8; 05.03.2015
comment
Измените include или оба типа модулей, и тогда это лучший ответ IMO. Обратите внимание, как он include сделал модуль, так что нет необходимости в RbConfig или Config. - person FilBot3; 31.05.2016