¿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.


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'


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"

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


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

¿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

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 .


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.