【问题标题】:Ruby interpreter name [duplicate]Ruby解释器名称[重复]
【发布时间】:2010-12-06 17:44:02
【问题描述】:

可能重复:
How do I find the ruby interpreter?

如何在 Ruby 中获取当前正在运行的 Ruby 1.8 解释器名称(例如 /usr/bin/ruby),即传递给 C 的 main() 函数的 argv[0]。我对$0 不感兴趣,因为那是.rb 脚本文件的名称。我也对Config::CONFIG 不感兴趣,因为它在安装 Ruby 时已被填满——但我对它在哪里运行 now 感兴趣。

假设/usr/bin/ruby/usr/bin/ruby1.8 的符号链接。如何知道我的 Ruby 脚本是以 /usr/bin/ruby1.8 myscript.rb 还是 /usr/bin/ruby myscript.rb 启动的?

【问题讨论】:

    标签: ruby interpreter argv


    【解决方案1】:

    How do I find the ruby interpreter?

    require 'rbconfig'
    RUBY_INTERPRETER_PATH = File.join(Config::CONFIG["bindir"],
                                  Config::CONFIG["RUBY_INSTALL_NAME"] +
                                  Config::CONFIG["EXEEXT"])
    

    如果您想了解 Ruby 特定信息,请查看 RUBY_* 常量

    >> RUBY_
    RUBY_COPYRIGHT     RUBY_ENGINE        RUBY_PLATFORM      RUBY_REVISION
    RUBY_DESCRIPTION   RUBY_PATCHLEVEL    RUBY_RELEASE_DATE  RUBY_VERSION
    

    【讨论】:

    • 感谢您提供帮助,但这不是我的问题的好答案,因为我对安装解释器时复制的位置不感兴趣(这就是我可以从 @987654325 得到的@),但我对解释器当前的位置感兴趣(即 C main 函数的 argv[0])。我感兴趣的不是Config::CONFIG
    【解决方案2】:

    @injekt 的答案有解释器的路径。

    以下是如何找到有关配置的详细信息。

    Ruby 的配置信息在编译期间存储在 rbconfig.rb 中,因此我们可以看到安装的详细信息。当解释器启动时,该信息被拉入 Object 中,因此我们可以获取值:

    >> Object.constants.select{ |c| c[/^RUBY/] }
    => [:RUBY_VERSION, :RUBY_RELEASE_DATE, :RUBY_PLATFORM, :RUBY_PATCHLEVEL, :RUBY_REVISION, :RUBY_DESCRIPTION, :RUBY_COPYRIGHT, :RUBY_ENGINE]
    
    >> RUBY_DESCRIPTION #=> "ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.5.0]"
    

    【讨论】:

    • 感谢您提供有关 Ruby 的有趣信息,但您所写的内容并没有回答我的问题。
    • 正如我所说,“@injekt 的答案有通向解释器的路径。”我正在扩展它,显示其他有用的信息。
    【解决方案3】:

    这是一个仅限 Linux 的解决方案:

    p File.open("/proc/self/cmdline") { |f| f.read.sub(/\0.*/m, "") }
    

    对于 Ruby 1.8,ruby.c 定义了包含此信息的 VALUE rb_argv0;,但该变量在 Ruby 脚本中不可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 2012-10-09
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多