Wie kann ich herausfinden, auf welchem ​​Betriebssystem mein Ruby-Programm ausgeführt wird?

Antworten:

142

Verwenden Sie die RUBY_PLATFORMKonstante und wickeln Sie sie optional in ein Modul ein, um sie benutzerfreundlicher zu gestalten:

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

Es ist nicht perfekt, funktioniert aber gut für die Plattformen, auf denen ich entwickle, und es ist einfach genug, es zu erweitern.

Aaron Hinni
quelle
8
Für jruby ist es besser RbConfig::CONFIG["host_os"], wenn Sie Ihr Betriebssystem verwenden.
FilBot3
2
Gibt es irgendwo etwas, wo so etwas in einen Edelstein verpackt ist, den man verwenden könnte, anstatt zu kopieren / einfügen oder so? Wenn ja, wo? :)
Lindes
1
Ich bevorzuge dies gegenüber jedem Juwel.
C Johnson
Gibt es eine Möglichkeit, nach einer bestimmten Windows-Version zu suchen, z. B. Windows 8.1?
Sajid
Da die Windows-Variante Regex nicht aktiviert ist, sollte jeder Name in Klammern für "|" stehen. oder wie erwartet arbeiten.
Epigene
23

(Warnung: Lesen Sie den Kommentar von @Peter Wagenet) Ich mag das, die meisten Leute verwenden Rubygems , es ist zuverlässig und plattformübergreifend

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- Verwendung in Verbindung mit "Update! Addition! Rubygems heutzutage ..." , um zu mildern, wannGem::Platform.local.os == 'java'

jtzero
quelle
4
Auf jruby wird nur "java" gemeldet, sodass es nicht ausreicht, wenn Sie erwarten, dass jemand jruby ausführt.
Peter Wagenet
17

Entweder

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

oder

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Vinko Vrsalovic
quelle
1
Meinst du nicht Config::CONFIG[‘host_os’]?
Andrew Grimm
5
"Verwenden Sie RbConfig anstelle der veralteten und veralteten Konfiguration" =>RbConfig::CONFIG["arch"]
jtzero
1
@jtzero Wenn Sie eine vollständigere Antwort in den Kommentaren geben, aktualisiere ich die Antwort aus dem Jahr 2008
Vinko Vrsalovic
in Ruby 1.9.3 (p327) ist es nur diese Zeile, Ruby hat es standardmäßigirb(main):002:0> require 'rbconfig' => false
jtzero
Als ich es tat, bekam ich eine Erklärung, dass es abgeschrieben wurde. (irb):10:in irb_binding ': Verwenden Sie RbConfig anstelle der veralteten und veralteten Config.` Also habe ich das verwendet RbConfig::CONFIG.eachund alle verschiedenen Werte aufgelistet. Vielleicht finden Sie dort etwas, das Ihnen hilft, das zu finden, wonach Sie suchen.
FilBot3
9

Ich habe eine zweite Antwort, um dem Kampf weitere Optionen hinzuzufügen. Das os rubygem und seine Github-Seite haben eine verwandte Projektliste .

erfordern 'os'

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

>> OS.bits
=> 32

>> OS.java?
=> true # wenn du in jruby rennst. Auch OS.jruby?

>> OS.ruby_bin
=> "c: \ ruby18 \ bin \ ruby.exe" # oder "/ usr / local / bin / ruby" oder was nicht

>> OS.posix?
=> false # true für Linux, OS X, Cygwin

>> OS.mac? # oder OS.osx? oder OS.x?
=> falsch
jtzero
quelle
7

Probieren Sie das Juwel Launchy ( gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
Ryan McGeary
quelle
Das ist Launchy :: Application.new.host_os_family in 2.1.0.
Fakeleft
1
Zu Ihrer
Information
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
quelle
Ich denke das sollte sein case Config::CONFIG['host_os']?
Äquivalent8
Eigentlich sollte es in Ruby 2 sein RbConfig::Obsolete::CONFIG['host_os'] ... + keine Notwendigkeit, dasConfig
Äquivalent8
Ändern Sie den includeoder beide Modultypen, und dann ist dies die beste Antwort IMO. Beachten Sie, wie er includedas Modul verwendet hat, sodass weder RbConfig noch Config erforderlich sind.
FilBot3
2

Mit dem folgenden Code haben wir bisher ziemlich gute Ergebnisse erzielt

  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
quelle
0

Für etwas, das in den meisten Ruby-Installationen leicht zugänglich ist und bereits etwas für Sie verarbeitet wurde, empfehle ich Folgendes:

  1. Gem::Platform.local.os# => zB. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( code )
  2. Gem.win_platform?# => zB. wahr, falsch ( Code )

Sowohl dieses als auch jedes andere mir bekannte Plattformprüfungsskript basiert auf der Interpretation dieser zugrunde liegenden Variablen:

  1. RbConfig::CONFIG["host_os"]# => zB. "linux-gnu" (Code 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => zB. "i686-linux", "i386-linux-gnu" (wird als Parameter übergeben, wenn der Ruby-Interpreter kompiliert wird )
  3. RUBY_PLATFORM# => zB. "i386-linux-gnu", "darwin" - Beachten Sie, dass dies "java" in JRuby zurückgibt! ( Code )
    • Dies sind alles Windows-Varianten: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => zB. "rubin", "jruby"

Bibliotheken sind verfügbar, wenn Sie sich nicht um die Abhängigkeit kümmern und etwas Benutzerfreundlicheres wünschen. Insbesondere bietet OS Methoden wie OS.mac?oder an OS.posix?. Die Plattform kann gut zwischen verschiedenen Unix-Plattformen unterscheiden. Platform::IMPLwird zurückkehren, z. : linux ,: freebsd ,: netbsd ,: hpux. sys-uname und sysinfo sind ähnlich. utilinfo ist äußerst einfach und schlägt auf allen Systemen außerhalb von Windows, Mac und Linux fehl.

Wenn Sie erweiterte Bibliotheken mit bestimmten Systemdetails wie verschiedene Linux-Distributionen wünschen, lesen Sie meine Antwort zum Erkennen der Linux-Distribution in Ruby .

sondra.kinsey
quelle
Ich würde gern gesehen genauere Erklärungen oder Links zu wie RUBY_PLATFORModer RbConfig::CONFIG["host_os"]bestückt sind. Wenn ich mir den Code anschaue, ist mir das immer noch nicht klar.
sondra.kinsey
-6

Wenn ich nur wissen muss, ob es sich um ein Windows- oder Unix-ähnliches Betriebssystem handelt, reicht dies oft aus

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
dimus
quelle
1
File :: SEPARATOR gibt / in Windows, so dass dies nicht funktioniert
Peter
3
Überall schlechte Praxis. Wenn Sie wissen möchten, was das Dateitrennzeichen ist, verwenden Sie File::SEPARATOR. Es ist am besten, die Plattform wie bei der Entwicklung in Ruby zu ducken. Wenn Sie jedoch wissen müssen, ob es sich bei der Plattform um Windows handelt, stellen Sie die Frage, anstatt darauf zu schließen.
Robin Daugherty