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 rubygem 및 github 페이지 에는 관련 프로젝트 목록이 있습니다.

'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"

종속성을 신경 쓰지 않고 좀 더 사용자 친화적 인 것을 원하는 경우 라이브러리를 사용할 수 있습니다. 특히 OS 는 OS.mac?또는 OS.posix?. 플랫폼 은 다양한 유닉스 플랫폼을 잘 구별 할 수 있습니다. Platform::IMPL예를 들어 반환됩니다. : linux, : freebsd, : netbsd, : hpux. sys-uname 및 sysinfo 는 유사합니다. 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.