其他脚本中有变量,例如:
Python:print(sys.executable)
php:echo PHP_BINARY."\n";
红宝石中有类似的东西吗?
(红宝石 v.2.0)
以下答案均不可靠。它们使用静态信息,但您的 ruby 脚本可能由安装在不同于默认路径或不在 PATH 环境变量中的路径中的 ruby 实例执行。
你需要做的是使用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
目录中读取此信息。
尝试%x(where ruby)
你必须在你的路径中有 ruby.exe 才能工作,这样 Windows 就知道你在说什么“红宝石”。
你可以看看 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']
)
它对我同样有效。