Jak mogę sprawdzić, w jakim systemie operacyjnym działa mój program Ruby?

Odpowiedzi:

143

Użyj RUBY_PLATFORMstałej i opcjonalnie zawiń ją w moduł, aby była bardziej przyjazna:

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

Nie jest doskonały, ale działa dobrze na platformach, na których pracuję, i jest dość łatwy do rozszerzenia.

Aaron Hinni
źródło
8
dla jruby, lepiej jest użyć go RbConfig::CONFIG["host_os"]do pobrania systemu operacyjnego.
FilBot3
2
Czy jest gdzieś, gdzie coś takiego jest zapakowane w klejnot, którego można by użyć zamiast kopiowania / wklejania lub czegoś takiego? Jeśli tak, to gdzie? :)
lindes
1
Wolę to od jakiegokolwiek klejnotu.
C Johnson
Czy jest jakiś sposób, żebym mógł sprawdzić konkretną wersję systemu Windows, na przykład Windows 8.1?
Sajid
Tak przy okazji, że wyrażenie regularne wariantu systemu Windows jest wyłączone, każda nazwa powinna znajdować się w nawiasie dla "|" lub działać zgodnie z oczekiwaniami.
Epigene,
24

(Ostrzeżenie: przeczytaj komentarz @Peter Wagenet) Podoba mi się to, większość ludzi używa rubygemów , jest niezawodny, jest wieloplatformowy

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"

użycie aktualizacji w połączeniu z „Aktualizacja! Dodatek! Rubygems obecnie ...”, aby złagodzić kiedyGem::Platform.local.os == 'java'

jtzero
źródło
4
Na jruby wyświetla tylko "java", więc nie wystarczy, jeśli spodziewasz się, że ktoś będzie biegł jruby.
Peter Wagenet
17

Zarówno

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

lub

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Vinko Vrsalovic
źródło
1
Nie masz na myśli Config::CONFIG[‘host_os’]?
Andrew Grimm,
5
„Użyj RbConfig zamiast przestarzałej i przestarzałej RbConfig::CONFIG["arch"]
konfiguracji
1
@jtzero Jeśli podasz pełniejszą odpowiedź w komentarzach, zaktualizuję odpowiedź napisaną w 2008 roku
Vinko Vrsalovic
w ruby ​​1.9.3 (p327) to tylko ta linia, ruby ​​ma ją domyślnieirb(main):002:0> require 'rbconfig' => false
jtzero
Kiedy to zrobiłem, otrzymałem oświadczenie, że zostało to umorzone. (irb):10:in irb_binding ': Użyj RbConfig zamiast przestarzałej i przestarzałej konfiguracji .` Więc użyłem tego RbConfig::CONFIG.eachi wymieniłem wszystkie różne wartości. Może znajdziesz tam coś, co pomoże Ci znaleźć to, czego szukasz.
FilBot3
10

Mam drugą odpowiedź, aby dodać więcej opcji do walki. Os rubygem i ich strona github zawiera listę powiązanych projektów.

wymagaj „os”

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

>> Bity systemu operacyjnego
=> 32

>> OS.java?
=> true # jeśli biegasz w jrubach. Również OS.jruby?

>> OS.ruby_bin
=> „c: \ ruby18 \ bin \ ruby.exe” # lub „/ usr / local / bin / ruby” lub co nie

>> OS.posix?
=> false # true dla linux, os x, cygwin

>> OS.mac? # lub OS.osx? lub OS.x?
=> fałsz
jtzero
źródło
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
pisaruk
źródło
Myślę, że to powinno być case Config::CONFIG['host_os']?
odpowiednik 8
właściwie w ruby ​​2 powinno być RbConfig::Obsolete::CONFIG['host_os'] ... + nie ma potrzeby dołączaniaConfig
odpowiednika 8
Zmień includelub oba typy modułów, a wtedy jest to najlepsza odpowiedź IMO. Zwróć uwagę, jak on includebył modułem, więc nie ma potrzeby używania RbConfig ani Config.
FilBot3
2

Jak dotąd radzimy sobie całkiem nieźle z następującym kodem

  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
adamliesko
źródło
1

W przypadku czegoś łatwo dostępnego w większości instalacji Rubiego, które jest już nieco przetworzone, polecam następujące:

  1. Gem::Platform.local.os# => np. „mingw32”, „java”, „linux”, „cygwin”, „aix”, „dalvik” ( kod )
  2. Gem.win_platform?# => np. prawda, fałsz ( kod )

Zarówno ten, jak i każdy inny skrypt sprawdzający platformę, który znam, opiera się na interpretacji tych podstawowych zmiennych:

  1. RbConfig::CONFIG["host_os"]# => np. „linux-gnu” (kod 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => np. "i686-linux", "i386-linux-gnu" (przekazywane jako parametr, gdy kompilowany jest interpreter języka Ruby )
  3. RUBY_PLATFORM# => np. "i386-linux-gnu", "darwin" - Zwróć uwagę, że w JRuby zwraca to "java"! ( kod )
    • Oto wszystkie warianty systemu Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => np. „rubinowy”, „jruby”

Biblioteki są dostępne, jeśli nie masz nic przeciwko zależnościom i chcesz czegoś bardziej przyjaznego dla użytkownika. W szczególności system operacyjny oferuje metody takie jak OS.mac?lub OS.posix?. Platforma może dobrze rozróżniać różne platformy Unix. Platform::IMPLpowróci np. : linux,: freebsd,: netbsd,: hpux. sys-uname i sysinfo są podobne. utilinfo jest niezwykle proste i zawiedzie w każdym systemie poza Windows, Mac i Linux.

Jeśli potrzebujesz bardziej zaawansowanych bibliotek z określonymi szczegółami systemu, takimi jak różne dystrybucje Linuksa, zobacz moją odpowiedź na temat wykrywania dystrybucji Linuksa w Rubim .

sondra.kinsey
źródło
Z zadowoleniem przyjąłbym bardziej precyzyjne wyjaśnienia lub linki do tego, jak RUBY_PLATFORMlub RbConfig::CONFIG["host_os"]są wypełniane. Patrząc na kod, nadal nie jest to dla mnie jasne.
sondra.kinsey
-6

Kiedy chcę tylko wiedzieć, czy jest to system operacyjny Windows czy Unix, często wystarczy

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
dimus
źródło
1
Plik :: SEPARATOR daje / w oknach, więc to nie działa
peter
3
Wszędzie złe praktyki. Jeśli chcesz wiedzieć, co to jest separator plików, użyj File::SEPARATOR. Platformę najlepiej jest tworzyć tak samo, jak w języku Ruby. Ale jeśli musisz wiedzieć, czy platformą jest Windows, zadaj pytanie zamiast próbować to wywnioskować.
Robin Daugherty