Como posso descobrir em qual sistema operacional meu programa Ruby está sendo executado?


Respostas:


142

Use a RUBY_PLATFORMconstante e, opcionalmente, envolva-a em um módulo para torná-la mais amigável:

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

Não é perfeito, mas funciona bem para as plataformas em que desenvolvo e é fácil de estender.


8
para jruby, é melhor usar RbConfig::CONFIG["host_os"]para obter seu sistema operacional.
FilBot3

2
Existe algum lugar onde algo assim seja empacotado em uma joia, que alguém possa usar, em vez de copiar / colar ou algo assim? Se sim, onde? :)
lindes

1
Eu prefiro isso a qualquer joia.
C Johnson

Existe alguma maneira de verificar se há uma versão específica do Windows, por exemplo, Windows 8.1?
Sajid

Essa variante regex do Windows está desativada aliás, cada nome deve estar entre parênteses para "|" ou para trabalhar como esperado.
Epigene

23

(Aviso: leia o comentário de @Peter Wagenet) Eu gosto disso, a maioria das pessoas usa rubygems , é confiável, é 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"

atualizar o uso em conjunto com "Atualizar! Adição! Rubygems hoje em dia ..." para mitigar quandoGem::Platform.local.os == 'java'


4
No jruby, ele reporta apenas "java", portanto não é suficiente se você espera que alguém execute o jruby.
Peter Wagenet

17

Ou

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

ou

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"

1
Você não quer dizer Config::CONFIG[‘host_os’]?
Andrew Grimm

5
"Use RbConfig em vez de obsoleto e obsoleto Config" =>RbConfig::CONFIG["arch"]
jtzero

1
@jtzero Se você fornecer uma resposta mais completa nos comentários, atualizarei a resposta escrita em 2008
Vinko Vrsalovic

em ruby ​​1.9.3 (p327) é apenas essa linha, ruby ​​tem por padrãoirb(main):002:0> require 'rbconfig' => false
jtzero

Quando fiz isso, recebi um comunicado dizendo que estava depreciado. (irb):10:in irb_binding ': Use RbConfig em vez de Config obsoleto e obsoleto. Então, usei isso RbConfig::CONFIG.eache listei todos os valores diferentes. Talvez você possa encontrar algo lá para ajudá-lo a encontrar o que procura.
FilBot3

9

Eu tenho uma segunda resposta, para adicionar mais opções à briga. O os rubygem e sua página no github têm uma lista de projetos relacionados.

requer 'os'

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

>> OS.bits
=> 32

>> OS.java?
=> true # se você estiver executando em jruby. Também OS.jruby?

>> OS.ruby_bin
=> "c: \ ruby18 \ bin \ ruby.exe" # ou "/ usr / local / bin / ruby" ou o que não

>> OS.posix?
=> false # true para linux, os x, cygwin

>> OS.mac? # ou OS.osx? ou 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

Eu acho que isso deveria ser case Config::CONFIG['host_os']?
equivalente em 8 de

na verdade, em ruby ​​2, deve ser RbConfig::Obsolete::CONFIG['host_os'] ... + não há necessidade de incluir oConfig
equivalente 8

Mude o includeou ambos os tipos de Módulos, e então esta é a melhor resposta IMO. Observe como ele includeinstalou o Módulo, portanto, não há necessidade de RbConfig ou Config.
FilBot3


2

Estamos indo muito bem até agora com o seguinte 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 prontamente acessível na maioria das instalações Ruby que já foi processado de alguma forma para você, eu recomendo estes:

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

Esses e todos os outros scripts de verificação de plataforma que conheço se baseiam na interpretação dessas variáveis ​​subjacentes:

  1. RbConfig::CONFIG["host_os"]# => por exemplo. "linux-gnu" (código 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => por exemplo. "i686-linux", "i386-linux-gnu" (passado como parâmetro quando o interpretador Ruby é compilado )
  3. RUBY_PLATFORM# => por exemplo. "i386-linux-gnu", "darwin" - Observe que retorna "java" em JRuby! ( código )
    • Todas essas são variantes do Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => por exemplo. "ruby", "jruby"

Bibliotecas estão disponíveis se você não se importar com a dependência e quiser algo um pouco mais amigável. Especificamente, o sistema operacional oferece métodos como OS.mac?ou OS.posix?. A plataforma pode distinguir bem entre uma variedade de plataformas Unix. Platform::IMPLretornará, por exemplo. : linux,: freebsd,: netbsd,: hpux. sys-uname e sysinfo são semelhantes. utilinfo é extremamente básico e falhará em qualquer sistema além do Windows, Mac e Linux.

Se você quiser bibliotecas mais avançadas com detalhes específicos do sistema, como diferentes distribuições Linux, veja minha resposta para Detectar distribuição Linux em Ruby .


Eu gostaria de obter explicações ou links mais precisos sobre como RUBY_PLATFORMou RbConfig::CONFIG["host_os"]são preenchidos. Olhando para o código, ainda não está claro para mim.
sondra.kinsey

-6

Quando eu só preciso saber se é um sistema operacional Windows ou Unix, muitas vezes basta

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true

1
Arquivo :: SEPARATOR dá / no windows, então isso não funciona
peter

3
Má prática geral. Se você quiser saber o que é o separador de arquivos, use File::SEPARATOR. É melhor digitar a plataforma como se fosse desenvolver em Ruby. Mas se você precisa saber se a plataforma é Windows, faça a pergunta em vez de tentar inferir.
Robin Daugherty de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.