2

我正在寻找一种强大、优雅且可移植的解决方案来获取 Ruby 中的用户名、主机名和操作系统名。我想创建一个这样设置的文件夹结构:

linux/maschine1/user53, or
linux/maschine2/user53, or 
windows/maschine1/user53, or
mac/supermac/superuser

用户名和主机名应反映user@computer:~$在 linux shell 上,操作系统应分为winlinuxmac

我找到了几种方法,使用ENV['USER'/'USERNAME']Etc.getLogin()作为用户名,Socket.gethostname计算机名和RUBY_PLATFORM操作系统名的常量。但在 JRuby 等不同平台甚至不同操作系统上运行时,它们都存在问题。

那么哪种选择对每个人来说都是最好的呢?

谢谢!

编辑:

在给出答案之前不久,我来到了这个解决方案。由于 Buildr 也可以使用 Java 命令,因此可以获得如下值:

os = Java.java.lang.System.getProperty('os.name')
usr = Java.java.lang.System.getProperty('user.name')
host = Java.java.net.InetAddress.getLocalHost().getHostName()

但我想我会使用纯 ruby​​ 的方式来尽可能地保持语言的一致性。

4

1 回答 1

2

不确定是否真的有一个 gem 可以做到这一切,但我认为 Etc.getlogin 和 Socket.getshostname 应该可以跨平台工作。我使用这个或变体来获取操作系统:

require 'rbconfig'

  def os
    @os ||= (
      host_os = RbConfig::CONFIG['host_os']
      case host_os
      when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
        :windows
      when /darwin|mac os/
        :macosx
      when /linux/
        :linux
      when /solaris|bsd/
        :unix
      else
        raise "unknown os: #{host_os.inspect}"
      end
    )
  end

这是从 selenium gem 中窃取的:https ://code.google.com/p/selenium/source/browse/rb/lib/selenium/webdriver/common/platform.rb这可能会提供更多灵感。

于 2013-11-08T13:47:21.697 回答