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.