¿Cómo puedo encontrar en qué sistema operativo se está ejecutando mi programa Ruby?

Respuestas:

142

Use la RUBY_PLATFORMconstante y, opcionalmente, envuélvala en un módulo para que sea más amigable:

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

No es perfecto, pero funciona bien para las plataformas en las que desarrollo y es bastante fácil de ampliar.

Aaron Hinni
fuente
8
para jruby, es mejor usarlo RbConfig::CONFIG["host_os"]para obtener su sistema operativo.
FilBot3
2
¿Hay algún lugar donde algo como esto esté empaquetado en una gema, que se pueda usar, en lugar de copiar / pegar o algo así? ¿Si es así, donde? :)
lindes
1
Prefiero esto a cualquier joya.
C Johnson
¿Hay alguna forma de buscar una versión específica de Windows, por ejemplo, Windows 8.1?
Sajid
Esa expresión regular de la variante de Windows está desactivada por cierto, cada nombre debe estar entre paréntesis para "|" o trabajar como se esperaba.
Epigene
23

(Advertencia: lea el comentario de @Peter Wagenet) Me gusta esto, la mayoría de la gente usa rubygems , es confiable, es multiplataforma

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"

actualizar el uso junto con "Actualizar! Adición! Rubygems hoy en día ..." para mitigar cuandoGem::Platform.local.os == 'java'

jtzero
fuente
4
En jruby, solo informa "java", por lo que no es suficiente si espera que alguien ejecute jruby.
Peter Wagenet
17

Ya sea

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

o

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Vinko Vrsalovic
fuente
1
¿No te refieres Config::CONFIG[‘host_os’]?
Andrew Grimm
5
"Use RbConfig en lugar de la configuración obsoleta y obsoleta" =>RbConfig::CONFIG["arch"]
jtzero
1
@jtzero Si proporciona una respuesta más completa en los comentarios, actualizaré la respuesta escrita en 2008
Vinko Vrsalovic
en ruby ​​1.9.3 (p327) es solo esa línea, ruby ​​lo tiene por defectoirb(main):002:0> require 'rbconfig' => false
jtzero
Cuando lo hice, recibí un comunicado diciendo que estaba depreciado. (irb):10:in irb_binding ': Use RbConfig en lugar de Config obsoleta y obsoleta.' Así que usé eso, RbConfig::CONFIG.eachy enumeré todos los valores diferentes. Quizás puedas encontrar algo allí que te ayude a encontrar lo que estás buscando.
FilBot3
9

Tengo una segunda respuesta, para agregar más opciones a la refriega. El os rubygem y su página de github tienen una lista de proyectos relacionados.

requiere 'os'

>> OS.windows?
=> verdadero # o OS.doze?

>> OS.bits
=> 32

>> OS.java?
=> verdadero # si está ejecutando en jruby. ¿También OS.jruby?

>> OS.ruby_bin
=> "c: \ ruby18 \ bin \ ruby.exe" # o "/ usr / local / bin / ruby" o lo que no

>> OS.posix?
=> falso # verdadero para linux, os x, cygwin

>> OS.mac? # o OS.osx? o OS.x?
=> falso
jtzero
fuente
7

Prueba la gema Launchy ( gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
Ryan McGeary
fuente
Eso es Launchy :: Application.new.host_os_family en 2.1.0.
fakeleft
1
FYI - Launchy usa rbconfig: github.com/copiousfreetime/launchy/blob/master/lib/launchy/…
codecraig
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
fuente
¿Supongo que esto debería ser case Config::CONFIG['host_os']?
equivalente 8
en realidad en ruby ​​2 debería ser RbConfig::Obsolete::CONFIG['host_os'] ... + no es necesario incluir elConfig
equivalente8
Cambie los includetipos de módulos o ambos, y esta es la mejor respuesta en mi opinión. Fíjese en cómo estaba includeel módulo, por lo que no es necesario RbConfig o Config.
FilBot3
2

Lo hemos estado haciendo bastante bien hasta ahora con el siguiente código

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

Para algo fácilmente accesible en la mayoría de las instalaciones de Ruby que ya está algo procesado para usted, le recomiendo lo siguiente:

  1. Gem::Platform.local.os# => p. ej. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( código )
  2. Gem.win_platform?# => p. ej. verdadero, falso ( código )

Tanto estos como todos los demás scripts de verificación de plataformas que conozco se basan en la interpretación de estas variables subyacentes:

  1. RbConfig::CONFIG["host_os"]# => p. ej. "linux-gnu" (código 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => p. ej. "i686-linux", "i386-linux-gnu" (se pasa como parámetro cuando se compila el intérprete de Ruby )
  3. RUBY_PLATFORM# => p. ej. "i386-linux-gnu", "darwin" - ¡ Tenga en cuenta que esto devuelve "java" en JRuby! ( codigo )
    • Estas son todas las variantes de Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => p. ej. "ruby", "jruby"

Las bibliotecas están disponibles si no le importa la dependencia y desea algo un poco más fácil de usar. Específicamente, OS ofrece métodos como OS.mac?o OS.posix?. La plataforma puede distinguir bien entre una variedad de plataformas Unix. Platform::IMPLvolverá, por ejemplo. : linux,: freebsd,: netbsd,: hpux. sys-uname y sysinfo son similares. utilinfo es extremadamente básico y fallará en cualquier sistema más allá de Windows, Mac y Linux.

Si desea bibliotecas más avanzadas con detalles específicos del sistema, como diferentes distribuciones de Linux, consulte mi respuesta para Detectar la distribución de Linux en Ruby .

sondra.kinsey
fuente
Yo daría la bienvenida a explicaciones más precisas o enlaces a cómo RUBY_PLATFORMo RbConfig::CONFIG["host_os"]están pobladas. Mirando el código, todavía no me queda claro.
sondra.kinsey
-6

Cuando solo necesito saber si es un sistema operativo Windows o similar a Unix, a menudo es suficiente

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
dimus
fuente
1
Archivo :: SEPARADOR da / en las ventanas, así que esto no funciona
Peter
3
Mala práctica por todos lados. Si desea saber cuál es el separador de archivos, use File::SEPARATOR. Es mejor escribir pato en la plataforma como se desarrolla en Ruby. Pero si tiene que saber si la plataforma es Windows, haga la pregunta en lugar de intentar inferirla.
Robin Daugherty