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.

Aaron Hinni
fonte
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'

jtzero
fonte
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"
Vinko Vrsalovic
fonte
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
jtzero
fonte
7

Experimente a joia Launchy ( gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
Ryan McGeary
fonte
Isso é Launchy :: Application.new.host_os_family em 2.1.0.
fakeleft
1
Para sua informação - o 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
fonte
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
Adamliesko
fonte
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 .

sondra.kinsey
fonte
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
dimus
fonte
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