什么是Ruby相当于Python的sys.executable?

时间:2009-10-08 09:10:21

标签: ruby

在Python中,你可以做到

>>> import sys
>>> sys.executable
'/usr/bin/python'

获取可执行文件的位置。你能用内置于Ruby的东西做同样的事情吗?它可以是一个特殊的变量,方法等。

如果没有,那么以跨平台方式确定ruby可执行文件位置的最干净,最可靠的方法是什么?

相关

5 个答案:

答案 0 :(得分:6)

在IRB中运行:

require 'rbconfig'

key_length = RbConfig::CONFIG.keys.max{ |a,b| a.length <=> b.length }.length
RbConfig::CONFIG.keys.sort_by{ |a| a.downcase }.each { |k| puts "%*s => %s" % [key_length, k, RbConfig::CONFIG[k]] }

它将输出所有Ruby配置信息的“awesome print”样式列表。

   ALLOCA => 
       AR => ar
     arch => x86_64-darwin10.5.0
ARCH_FLAG => 
  archdir => /Users/greg/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/x86_64-darwin10.5.0
 ARCHFILE => 
       AS => as
  ASFLAGS => 
 BASERUBY => ruby
   bindir => /Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin

bindir是当前运行的Ruby解释器的路径。列表中的上方是BASERUBY => ruby

RbConfig::CONFIG.values_at('bindir', 'BASERUBY').join('/')
=> "/Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/ruby"

检查我的工作:

greg-mbp-wireless:~ greg$ which ruby
/Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/ruby

有比这更多的信息,所以值得运行我在上面添加的代码,看看有什么可用。

答案 1 :(得分:2)

基于Linux的系统可以

`whereis ruby`.split(" ")[1]

它将调用whereis ruby并解析其第二个条目的输出(首先包含'whereis:')

更严格的方法是调用

puts `ls -al /proc/#{$$}/exe`.split(" ")[-1]

它将从/ proc / pid / exe符号链接信息中获取当前进程的可执行文件名(有$ variable和Process.pid方法来获取)。

答案 2 :(得分:1)

在脚本中工作,而不是来自irb

puts open($PROGRAM_NAME).readline.gsub /#! *([^ ]+).*/, '\1'

- )

答案 3 :(得分:1)

答案 4 :(得分:1)

看起来唯一真正的可靠方式是

 system("#{Gem.ruby} another_file.rb")

这甚至适用于像jruby作为jar等运行的奇怪案例。

另见

 OS.ruby_bin

https://github.com/rdp/os