2013-09-21 2 views
3

Когда файл загружается/требуется через символическую ссылку, все методы, ключевые слова и т. Д., Которые относятся к имени файла, похоже, относятся к имени ссылки, а не к реальное имя файла. Например, предположим, что у меня есть файл foo.rb с его содержанием что-то вроде:Доступ к реальному имени файла символьного связанного файла

puts __FILE__, __dir__, caller 

и символическую ссылку, указывающую на bar.rbfoo.rb. Если я загружаю/требую foo.rb через символическую ссылку bar.rb, то все имена файлов, указанные вышеприведенными командами, описывают символическое имя ссылки bar.rb, а не действительное имя файла foo.rb.

Есть ли способ, чтобы вызвать аналоги __FILE__, __dir__, caller и т.д. с именами файлов, указывающих на реальный файл, а не символические имена ссылок?

+1

Как вы определяете "реальный", я вас спрашиваю? Ваше «реальное» имя файла - это всего лишь запись в метаданных FS, указывающая на определенное местоположение на диске. Так символическая ссылка. Те же самые данные могут быть решены многими именами. Как вы выбираете один «настоящий»? –

+0

@SergioTulentsev Может быть, мое использование слова «реальный», возможно, не было подходящим, но вы, кажется, знаете, что я имею в виду. И есть определенная разница между символическими ссылками и тем, что я называю реальными файлами. – sawa

+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"] 
+5

Вы также можете использовать ядро ​​'require File.realpath ('...')' вместо 'Pathname'. – koffeinfrei

+0

@koffeinfrei: Спасибо, я думаю, что предпочитаю 'File.realpath', поэтому добавил, чтобы ответить –

+0

Спасибо за добавление детали. – sawa

Смежные вопросы