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