Bagaimana cara mengetahui sistem operasi yang menjalankan program Ruby saya?


Jawaban:


143

Gunakan RUBY_PLATFORMkonstanta, dan secara opsional bungkus dalam sebuah modul agar lebih bersahabat:

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

Ini tidak sempurna, tetapi berfungsi dengan baik untuk platform tempat saya melakukan pengembangan, dan cukup mudah untuk diperluas.


8
untuk jruby, lebih baik Anda menggunakan RbConfig::CONFIG["host_os"]OS Anda.
FilBot3

2
Adakah tempat di mana sesuatu seperti ini dikemas menjadi permata, yang dapat digunakan seseorang, alih-alih menyalin / menempel atau semacamnya? Jika ya, dimana? :)
lindes

1
Saya lebih suka ini daripada permata apa pun.
C Johnson

Apakah ada cara agar saya dapat memeriksa versi windows tertentu, misalnya Windows 8.1?
Sajid

Regex varian windows itu tidak aktif, setiap nama harus berada dalam tanda kurung untuk "|" atau bekerja seperti yang diharapkan.
Epigene

24

(Peringatan: baca komentar @Peter Wagenet) Saya suka ini, kebanyakan orang menggunakan rubygems , andal, lintas platform

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"

update digunakan bersama dengan "Perbarui! Penambahan! Rubygems saat ini ..." untuk mengurangi kapanGem::Platform.local.os == 'java'


4
Pada jruby itu hanya melaporkan "java" jadi itu tidak cukup jika Anda berharap ada orang yang menjalankan jruby.
Peter Wagenet

17

Antara

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

atau

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

1
Anda tidak berarti Config::CONFIG[‘host_os’]?
Andrew Grimm

5
"Gunakan RbConfig sebagai ganti Config yang usang dan tidak digunakan lagi" =>RbConfig::CONFIG["arch"]
jtzero

1
@jtzero Jika Anda memberikan jawaban yang lebih lengkap di komentar saya akan memperbarui jawaban yang ditulis pada tahun 2008
Vinko Vrsalovic

di ruby ​​1.9.3 (p327) hanya baris itu, ruby ​​memilikinya secara defaultirb(main):002:0> require 'rbconfig' => false
jtzero

Ketika saya melakukannya, saya mendapat pernyataan yang mengatakan bahwa itu disusutkan. (irb):10:in irb_binding ': Gunakan RbConfig daripada Config.` Jadi saya menggunakan itu, RbConfig::CONFIG.eachdan mendaftar semua nilai yang berbeda. Mungkin Anda dapat menemukan sesuatu di sana untuk membantu Anda menemukan apa yang Anda cari.
FilBot3

10

Saya punya jawaban kedua, untuk menambahkan lebih banyak opsi. Os rubygem , dan halaman github mereka memiliki daftar proyek terkait.

membutuhkan 'os'

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

>> OS.bits
=> 32

>> OS.java?
=> true # jika Anda menjalankan jruby. Juga OS.jruby?

>> OS.ruby_bin
=> "c: \ ruby18 \ bin \ ruby.exe" # atau "/ usr / local / bin / ruby" atau yang tidak

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

>> OS.mac? # atau OS.osx? atau OS.x?
=> salah


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

Saya kira ini seharusnya case Config::CONFIG['host_os']?
setara 8

sebenarnya di ruby ​​2 seharusnya RbConfig::Obsolete::CONFIG['host_os'] ... + tidak perlu menyertakanConfig
ekuivalen8

Ubah includeatau kedua jenis Modul, dan ini adalah jawaban terbaik IMO. Perhatikan bagaimana dia includeModul, jadi tidak perlu RbConfig atau Config.
FilBot3


2

Kami telah melakukan cukup baik sejauh ini dengan kode berikut

  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

1

Untuk sesuatu yang mudah diakses di sebagian besar instalasi Ruby yang sudah diproses untuk Anda, saya merekomendasikan ini:

  1. Gem::Platform.local.os# => mis. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( kode )
  2. Gem.win_platform?# => mis. benar, salah ( kode )

Baik ini dan setiap skrip pemeriksaan platform lainnya yang saya tahu didasarkan pada interpretasi variabel yang mendasari ini:

  1. RbConfig::CONFIG["host_os"]# => mis. "linux-gnu" (kode 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => mis. "i686-linux", "i386-linux-gnu" (diteruskan sebagai parameter saat interpreter Ruby dikompilasi )
  3. RUBY_PLATFORM# => mis. "i386-linux-gnu", "darwin" - Perhatikan bahwa ini mengembalikan "java" di JRuby! ( kode )
    • Ini semua adalah varian Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => mis. "ruby", "jruby"

Perpustakaan tersedia jika Anda tidak keberatan dengan ketergantungan tersebut dan menginginkan sesuatu yang sedikit lebih ramah pengguna. Secara khusus, OS menawarkan metode seperti OS.mac?atau OS.posix?. Platform dapat membedakan dengan baik antara berbagai platform Unix. Platform::IMPLakan kembali, mis. : linux,: freebsd,: netbsd,: hpux. sys-uname dan sysinfo serupa. utilinfo sangat mendasar, dan akan gagal pada sistem apa pun selain Windows, Mac, dan Linux.

Jika Anda menginginkan pustaka yang lebih canggih dengan detail sistem tertentu, seperti distribusi Linux yang berbeda, lihat jawaban saya untuk Mendeteksi distribusi Linux di Ruby .


Saya akan menerima penjelasan atau tautan yang lebih tepat tentang bagaimana RUBY_PLATFORMatau RbConfig::CONFIG["host_os"]diisi. Melihat kodenya, masih belum jelas bagi saya.
sondra.kinsey

-6

Ketika saya hanya ingin tahu apakah itu Windows atau OS mirip Unix, itu sudah cukup

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

1
File :: SEPARATOR memberikan / di windows, jadi ini tidak berfungsi
peter

3
Praktik buruk di sekitar. Jika Anda ingin mengetahui apa itu pemisah file, gunakan File::SEPARATOR. Yang terbaik adalah menghindari platform seperti mengembangkan di Ruby. Tetapi jika Anda harus tahu apakah platform tersebut adalah Windows, ajukan pertanyaan daripada mencoba menyimpulkannya.
Robin Daugherty
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.