当通过符号链接加载/需要文件时,引用文件名的所有方法,关键字等似乎都是指链接名称,而不是真实文件名。例如,假设我有一个文件foo.rb
,其内容类似于:
puts __FILE__, __dir__, caller
以及指向bar.rb
的符号链接foo.rb
。如果我通过符号链接foo.rb
加载/需要bar.rb
,则上述命令给出的所有文件名都描述了符号链接名称bar.rb
,而不是真实文件名{{ 1}}。
有没有办法调用foo.rb
,__FILE__
,__dir__
等的对应方,文件名指向真实文件,而不是符号链接名称?
答案 0 :(得分:5)
您无法轻易更改所有这些常量和内置插件,但您可以这样做:
File.realpath( "/path/to/file/or/symlink" )
或
require 'pathname'
Pathname.new( "/path/to/file/or/symlink" ).realpath
示例文件 realfile.rb
names = [ __FILE__, __dir__]
p names
p names.map { |name| File.realpath(name) }
设置并调用如下:
ln -s realfile.rb thelinkfile
ruby thelinkfile
输出:
["thelinkfile", "/Users/neilslater/scraps"]
["/Users/neilslater/scraps/realfile.rb", "/Users/neilslater/scraps"]