Ruby 프로그램이 실행중인 운영 체제를 어떻게 찾을 수 있습니까?


답변:


142

RUBY_PLATFORM상수를 사용 하고 선택적으로 모듈에 래핑하여 더 친숙하게 만듭니다.

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

완벽하지는 않지만 내가 개발하는 플랫폼에서 잘 작동하며 확장하기가 쉽습니다.


8
jruby의 경우 RbConfig::CONFIG["host_os"]OS를 사용 하는 것이 좋습니다 .
FilBot3 2013

2
복사 / 붙여 넣기 대신 사용할 수있는 gem에 이와 같은 것이 패키징 된 곳이 있습니까? 그렇다면 어디? :)
lindes

1
나는 어떤 보석보다 이것을 선호합니다.
C Johnson

특정 버전의 Windows (예 : Windows 8.1)를 확인할 수있는 방법이 있습니까?
Sajid

Windows 변형 정규식이 꺼져 있습니다. 각 이름은 "|"에 대한 괄호 안에 있어야합니다. 또는 예상대로 작동합니다.
Epigene

23

(경고 : @Peter Wagenet의 의견을 읽으십시오) 나는 이것을 좋아합니다. 대부분의 사람들은 rubygems를 사용 합니다.

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"

업데이트 와 함께 사용하는 "업데이트! 추가! 젬 요즘 ..." 때 완화하는Gem::Platform.local.os == 'java'


4
jruby에서는 "java"만보고하므로 jruby를 실행하는 사람이있는 경우 충분하지 않습니다.
Peter Wagenet 2013

17

어느 한 쪽

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

또는

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

1
의미하지 Config::CONFIG[‘host_os’]않습니까?
Andrew Grimm

5
"구식되고 더 이상 사용되지 않는 구성 대신 RbConfig 사용"=>RbConfig::CONFIG["arch"]
jtzero

1
@jtzero 코멘트에 더 완전한 답변을 제공하면 2008 년에 작성된 답변을 업데이트하겠습니다
Vinko Vrsalovic

루비 1.9.3 (p327)에서 그 라인은 기본적으로 루비가 있습니다irb(main):002:0> require 'rbconfig' => false
jtzero

내가 그것을했을 때, 감가 상각되었다는 진술을 받았습니다. (irb):10:in irb_binding ': 더 이상 사용되지 않고 더 이상 사용되지 않는 Config 대신 RbConfig를 사용합니다 .` 그래서 나는 그것을 사용하고 RbConfig::CONFIG.each모든 다른 값을 나열했습니다. 원하는 것을 찾는 데 도움이되는 내용을 찾을 수 있습니다.
FilBot3 2013

9

나는 싸움에 더 많은 옵션을 추가하기 위해 두 번째 대답이 있습니다. os rubygemgithub 페이지 에는 관련 프로젝트 목록이 있습니다.

'os'필요

>> OS.windows?
=> true # 또는 OS.doze?

>> OS.bits
=> 32

>> OS.java?
=> true # jruby에서 실행중인 경우. 또한 OS.jruby?

>> OS.ruby_bin
=> "c : \ ruby18 \ bin \ ruby.exe"# 또는 "/ usr / local / bin / ruby"또는 기타

>> OS.posix?
=> false # linux, os x, cygwin의 경우 참

>> OS.mac? # 또는 OS.osx? 또는 OS.x?
=> 거짓


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

나는 이것이되어야한다고 생각한다 case Config::CONFIG['host_os']?
동등한 것

실제로 루비 2는해야 RbConfig::Obsolete::CONFIG['host_os'] ... +를 포함 할 필요가 없습니다Config
equivalent8

include모듈 유형 또는 두 가지 유형을 모두 변경하면 이것이 최상의 답변 IMO입니다. 그가 include모듈을 어떻게 만들 었는지 확인 하십시오. 따라서 RbConfig 또는 Config가 필요하지 않습니다.
FilBot3


2

우리는 지금까지 다음 코드로 꽤 잘 해왔습니다.

  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

이미 어느 정도 처리 된 대부분의 Ruby 설치에서 쉽게 액세스 할 수있는 항목의 경우 다음을 권장합니다.

  1. Gem::Platform.local.os# => 예. "mingw32", "java", "linux", "cygwin", "aix", "dalvik"( 코드 )
  2. Gem.win_platform?# => 예. 참, 거짓 ( 코드 )

이 스크립트와 내가 아는 다른 모든 플랫폼 검사 스크립트는 다음과 같은 기본 변수 해석을 기반으로합니다.

  1. RbConfig::CONFIG["host_os"]# => 예. "linux-gnu"(코드 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => 예. "i686-linux", "i386-linux-gnu"( Ruby 인터프리터가 컴파일 될 때 매개 변수로 전달됨 )
  3. RUBY_PLATFORM# => 예. "i386-linux-gnu", "darwin"-JRuby 에서 "java"를 반환합니다. ( 코드 )
    • 다음은 모두 Windows 변형입니다. /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => 예. "루비", "jruby"

종속성을 신경 쓰지 않고 좀 더 사용자 친화적 인 것을 원하는 경우 라이브러리를 사용할 수 있습니다. 특히 OSOS.mac?또는 OS.posix?. 플랫폼 은 다양한 유닉스 플랫폼을 잘 구별 할 수 있습니다. Platform::IMPL예를 들어 반환됩니다. : linux, : freebsd, : netbsd, : hpux. sys-unamesysinfo 는 유사합니다. utilinfo 는 매우 기본적이며 Windows, Mac 및 Linux 이외의 모든 시스템에서 실패합니다.

다른 Linux 배포와 같은 특정 시스템 세부 정보가 포함 된 고급 라이브러리를 원한다면 Ruby에서 Linux 배포 감지에 대한 내 대답을 참조하십시오 .


내가 어떻게 더 정확한 설명 또는 링크 환영 것 RUBY_PLATFORM또는 RbConfig::CONFIG["host_os"]채워됩니다. 코드를 보면 아직 명확하지 않습니다.
sondra.kinsey

-6

Windows 또는 Unix와 유사한 OS인지 알고 싶을 때

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

1
이 작동하지 않도록 파일 : SEPARATOR는 창에 / 제공
피터

3
사방에 나쁜 습관. 파일 구분자가 무엇인지 알고 싶다면 File::SEPARATOR. Ruby에서 개발하는 것처럼 플랫폼을 더킹하는 것이 가장 좋습니다. 그러나 플랫폼이 Windows인지 알아야한다면 추론하지 말고 질문하십시오.
Robin Daugherty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.