Rubyプログラムが実行されているオペレーティングシステムを見つけるにはどうすればよいですか?


回答:


143

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 2013

1
私はどんな宝石よりもこれを好みます。
C・ジョンソン

Windows 8.1など、特定のバージョンのWindowsを確認する方法はありますか?
Sajid 2016

そのWindowsバリアントの正規表現はオフです。各名前は「|」の括弧内に含める必要があります。または期待どおりに動作します。
エピジェネティック2017

24

(警告:@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"

更新「Update!Addition!Rubygems最近...」と組み合わせて使用​​すると、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
「廃止され廃止されたConfigの代わりにRbConfigを使用する」=>RbConfig::CONFIG["arch"]
jtzero 2013年

1
@jtzeroコメントでより完全な回答を提供する場合は、2008年に書かれた回答を更新します
Vinko Vrsalovic 2013年

ruby 1.9.3(p327)では、その行だけで、rubyにはデフォルトでそれがありますirb(main):002:0> require 'rbconfig' => false
jtzero 2013年

やってみると、減価償却されたという声明が出ました。(irb):10:in irb_binding ':廃止され廃止されたConfigの代わりにRbConfigを使用します。`そこで私はそれを使用し、RbConfig::CONFIG.eachすべての異なる値をリストしました。たぶんあなたはあなたが探しているものを見つけるのを助けるためにそこに何かを見つけることができます。
FilBot3 2013

10

争いにさらにオプションを追加するという2番目の答えがあります。 os ruby​​gemとそのgithubページには、関連するプロジェクトリストがあります。

'os'が必要

>> OS.windows?
=> true#またはOS.doze?

>> OS.bits
=> 32

>> OS.java?
=> true#jrubyで実行している場合。また、OS.jruby?

>> OS.ruby_bin
=> "c:\ ruby​​18 \ bin \ ruby​​.exe"#または "/ usr / local / bin / ruby​​"など

>> OS.posix?
=> false#linux、os x、cygwinの場合はtrue

>> OS.mac?#またはOS.osx?またはOS.x?
=> false


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
同等の

includeモジュールのタイプまたは両方のタイプを変更すると、これがベストアンサーIMOです。彼includeがモジュールをどのように作成したかに注目してください。RbConfigやConfigは必要ありません。
FilBot3 2016年


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

1

ほとんどのRubyインストールで簡単にアクセスでき、すでにある程度処理されているものについては、次のことをお勧めします。

  1. Gem::Platform.local.os#=>例 「mingw32」、「java」、「linux」、「cygwin」、「aix」、「dalvik」(コード
  2. Gem.win_platform?#=>例 true、false(コード

これらと私が知っている他のすべてのプラットフォームチェックスクリプトは、これらの基礎となる変数の解釈に基づいています。

  1. RbConfig::CONFIG["host_os"]#=>例 "LinuxベースのGNU"(コード12
  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#=>例 「ruby」、「jruby」

依存関係を気にせず、もう少しユーザーフレンドリーなものが必要な場合は、ライブラリを利用できます。具体的には、OSの提供方法が好きですOS.mac?OS.posix?プラットフォームは、さまざまなUnixプラットフォームをうまく区別できます。Platform::IMPL戻ります、例えば。:linux、:freebsd、:netbsd、:hpux。sys-unamesysinfoは似ています。utilinfoは非常に基本的なものであり、Windows、Mac、およびLinux以外のシステムでは失敗します。

さまざまなLinuxディストリビューションなど、特定のシステムの詳細を備えたより高度なライブラリが必要な場合は、RubyでのLinuxディストリビューションの検出に関する私の回答を参照してください。


より正確な説明RUBY_PLATFORMRbConfig::CONFIG["host_os"]、入力方法や入力方法へのリンクを歓迎します。コードを見ると、まだはっきりしていません。
sondra.kinsey

-6

それがWindowsまたはUnixライクなOSであるかどうかを知る必要があるときは、多くの場合、

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

1
File :: SEPARATORは/をウィンドウに表示するため、これは機能しません
ピーター

3
いたるところに悪い習慣。ファイル区切り文字が何であるかを知りたい場合は、を使用してくださいFile::SEPARATOR。Rubyで開発するのと同じように、プラットフォームをダックタイピングするのが最善です。ただし、プラットフォームがWindowsであるかどうかを知る必要がある場合は、推測するのではなく、質問してください。
Robin Daugherty
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.