Làm cách nào để biết chương trình Ruby của tôi đang chạy trên hệ điều hành nào?


Câu trả lời:


142

Sử dụng RUBY_PLATFORMhằng số và tùy chọn bọc nó trong một mô-đun để làm cho nó thân thiện hơn:

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ó không hoàn hảo, nhưng hoạt động tốt cho các nền tảng mà tôi phát triển và nó đủ dễ dàng để mở rộng.


8
đối với jruby, bạn nên sử dụng RbConfig::CONFIG["host_os"]để có được hệ điều hành của mình.
FilBot3

2
Có nơi nào mà thứ như thế này được đóng gói thành một viên đá quý, mà người ta có thể sử dụng, thay vì sao chép / dán hoặc tương tự không? Nếu vậy, ở đâu? :)
lindes

1
Tôi thích điều này hơn bất kỳ viên ngọc nào.
C Johnson

Có cách nào tôi có thể kiểm tra phiên bản cụ thể của cửa sổ, ví dụ như Windows 8.1 không?
Sajid

Biến thể cửa sổ regex đó bị tắt btw, mỗi tên phải nằm trong dấu ngoặc đơn cho "|" hoặc để hoạt động như mong đợi.
Epigene

23

(Cảnh báo: đọc bình luận của @Peter Wagenet) Tôi thích điều này, hầu hết mọi người sử dụng rubygem , đáng tin cậy của nó, là nền tảng chéo

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"

cập nhật sử dụng kết hợp với "Cập nhật! Bổ sung! Rubygems ngày nay ..." để giảm thiểu khiGem::Platform.local.os == 'java'


4
Trên jruby, nó chỉ báo cáo "java" nên không đủ nếu bạn mong đợi có ai đó đang chạy jruby.
Peter Wagenet

17

Hoặc

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

hoặc là

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

1
Ý bạn là Config::CONFIG[‘host_os’]không?
Andrew Grimm

5
"Sử dụng RbConfig thay vì lạc hậu và phản Config" =>RbConfig::CONFIG["arch"]
jtzero

1
@jtzero Nếu bạn cung cấp một câu trả lời hoàn chỉnh hơn trong các ý kiến I'l cập nhật các câu trả lời bằng văn bản trong năm 2008
Vinko Vrsalovic

trong ruby 1.9.3 (p327) dòng chỉ là của nó, ruby có nó theo mặc địnhirb(main):002:0> require 'rbconfig' => false
jtzero

Khi tôi làm điều đó, tôi nhận được thông báo rằng đã khấu hao. (irb):10:in irb_binding ': Sử dụng RbConfig thay vì Cấu hình lỗi thời và không được dùng nữa.' Vì vậy, tôi đã sử dụng nó RbConfig::CONFIG.eachvà liệt kê tất cả các giá trị khác nhau. Có thể bạn có thể tìm thấy một cái gì đó trong đó để giúp bạn tìm thấy những gì bạn đang tìm kiếm.
FilBot3

9

Tôi có câu trả lời thứ hai, để thêm nhiều lựa chọn hơn cho cuộc chiến. Hệ điều hành rubygemtrang github của họ có danh sách các dự án liên quan.

yêu cầu 'hệ điều hành'

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

>> OS.bits
=> 32

>> OS.java?
=> true # nếu bạn đang chạy trong jruby. Ngoài ra OS.jruby?

>> OS.ruby_bin
=> "c: \ ruby18 \ bin \ ruby.exe" # hoặc "/ usr / local / bin / ruby" hoặc không

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

>> OS.mac? # hoặc OS.osx? hoặc OS.x?
=> sai


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

Tôi đoán điều này nên được case Config::CONFIG['host_os']?
tương đương

thực sự trong ruby ​​2 nó phải là RbConfig::Obsolete::CONFIG['host_os'] ... + không cần phải bao gồmConfig
tương đương.

Thay đổi includehoặc cả hai loại Mô-đun, và đây là câu trả lời tốt nhất IMO. Lưu ý cách anh ta includesử dụng Mô-đun, vì vậy không cần RbConfig hoặc Cấu hình.
FilBot3


2

Chúng tôi đã làm khá tốt cho đến nay với đoạn mã sau

  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

Để có thứ gì đó có thể truy cập dễ dàng trong hầu hết các bản cài đặt Ruby đã được xử lý phần nào cho bạn, tôi khuyên bạn nên:

  1. Gem::Platform.local.os# => ví dụ: "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( )
  2. Gem.win_platform?# => ví dụ: true, false ( )

Cả hai tập lệnh này và mọi tập lệnh kiểm tra nền tảng khác mà tôi biết đều dựa trên việc diễn giải các biến cơ bản sau:

  1. RbConfig::CONFIG["host_os"]# => ví dụ: "linux-gnu" (mã 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => ví dụ: "i686-linux", "i386-linux-gnu" (được truyền dưới dạng tham số khi trình thông dịch Ruby được biên dịch )
  3. RUBY_PLATFORM# => ví dụ: "i386-linux-gnu", "darwin" - Lưu ý rằng điều này trả về "java" trong JRuby! ( )
    • Đây là tất cả các biến thể Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => ví dụ: "ruby", "jruby"

Các thư viện có sẵn nếu bạn không ngại sự phụ thuộc và muốn thứ gì đó thân thiện hơn với người dùng. Cụ thể, hệ điều hành cung cấp các phương thức như OS.mac?hoặc OS.posix?. Nền tảng có thể phân biệt tốt giữa nhiều nền tảng Unix. Platform::IMPLsẽ trở lại, ví dụ. : linux,: freebsd,: netbsd,: hpux. sys-unamesysinfo cũng tương tự. useinfo cực kỳ cơ bản và sẽ không thành công trên bất kỳ hệ thống nào ngoài Windows, Mac và Linux.

Nếu bạn muốn có các thư viện nâng cao hơn với các chi tiết hệ thống cụ thể, chẳng hạn như các bản phân phối Linux khác nhau, hãy xem câu trả lời của tôi cho Phát hiện bản phân phối Linux trong Ruby .


Tôi hoan nghênh các giải thích hoặc liên kết chính xác hơn về cách RUBY_PLATFORMhoặc RbConfig::CONFIG["host_os"]được điền. Nhìn vào mã, nó vẫn không rõ ràng với tôi.
sondra.kinsey

-6

Khi tôi chỉ cần biết đó là hệ điều hành giống Windows hay Unix thì thường là đủ

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

1
Tệp :: SEPARATOR cung cấp / trong cửa sổ, vì vậy điều này không hoạt động
peter

3
Thực hành xấu tất cả xung quanh. Nếu bạn muốn biết dấu tách tệp là gì, hãy sử dụng File::SEPARATOR. Tốt nhất bạn nên gõ nền tảng giống như phát triển trong Ruby. Nhưng nếu bạn phải biết liệu nền tảng đó có phải là Windows hay không, hãy đặt câu hỏi thay vì cố gắng suy luận.
Robin Daugherty
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.