在Python中,你可以做到
>>> import sys
>>> sys.executable
'/usr/bin/python'
获取可执行文件的位置。你能用内置于Ruby的东西做同样的事情吗?它可以是一个特殊的变量,方法等。
如果没有,那么以跨平台方式确定ruby可执行文件位置的最干净,最可靠的方法是什么?
相关:
答案 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