其他脚本中有变量,如:
python:print(sys.executable)
php:echo PHP_BINARY."\n";
红宝石中有类似的东西吗?
(ruby v.2.0)
答案 0 :(得分:0)
您可以查看rubinius configure(build_ruby)
所以,目前看起来如下:
require 'rbconfig'
def build_ruby
unless @build_ruby
bin = RbConfig::CONFIG["RUBY_INSTALL_NAME"] || RbConfig::CONFIG["ruby_install_name"]
bin += (RbConfig::CONFIG['EXEEXT'] || RbConfig::CONFIG['exeext'] || '')
@build_ruby = File.join(RbConfig::CONFIG['bindir'], bin)
end
@build_ruby
end
我也尝试了以下内容:
require 'rbconfig'
File.join( RbConfig::CONFIG['bindir'],
RbConfig::CONFIG['RUBY_INSTALL_NAME'] + RbConfig::CONFIG['EXEEXT']
)
它对我有用。
答案 1 :(得分:0)
尝试%x(where ruby)
你的路径中必须有ruby.exe才能正常工作,因此Windows知道你所说的'红宝石'。
答案 2 :(得分:0)
以下答案都不可靠。它们使用静态信息,但ruby脚本可能由安装在不同于默认路径的ruby实例或不在PATH环境变量中的路径执行。
您需要做的是使用WIN32 api。特别是,需要调用GetModuleHandle和GetModuleFileName函数。第一个获取实际过程的句柄,另一个返回其路径。
灵感的例子:
require 'ffi'
module Helpers
extend FFI::Library
ffi_lib :kernel32
typedef :uintptr_t, :hmodule
typedef :ulong, :dword
attach_function :GetModuleHandle, :GetModuleHandleA, [:string], :hmodule
attach_function :GetModuleFileName, :GetModuleFileNameA, [:hmodule, :pointer, :dword], :dword
def self.actualRubyExecutable
processHandle = GetModuleHandle nil
# There is a potential issue if the ruby executable path is
# longer than 999 chars.
rubyPath = FFI::MemoryPointer.new 1000
rubyPathSize = GetModuleFileName processHandle, rubyPath, 999
rubyPath.read_string rubyPathSize
end
end
puts Helpers.actualRubyExecutable
在Linux上,可以从/proc
目录中读取此信息。