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.


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'


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"

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


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

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

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 .


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.