2013-03-12 3 views
4

Я написал несколько небольших рубиновых скриптов для системного администрирования с использованием Ruby 1.9.3. В одном сценарии я использую:Непонятное поведение File.dirname

File.dirname(__FILE__) 

Чтобы получить каталог файла сценария. Это возвращает относительный путь, однако, когда я вызываю скрипт из второго скрипта, File.dirname возвращает абсолютный путь.

Ruby Doc перечисляет абсолютный путь возврата в своем примере, тогда как я нашел обсуждение на Ruby Forum, где пользователь говорит, что dirname должен возвращать только относительный путь.

Я использую предложенное решение от Ruby, Форумов использовать File.expand_path всегда получить абсолютный путь:

File.expand_path(File.dirname(__FILE__)) 

но есть способ, чтобы сделать поведение dirname последовательного?


UPDATE:

Для расширения Janathan Cairs ответа, я сделал два сценария:

s1.rb:

puts "External script __FILE__: #{File.dirname(__FILE__)}" 

s0.rb:

puts "Local script __FILE__: #{File.dirname(__FILE__)}" 
require './s1.rb' 

Запуск ./s0.rb дает последовательность нг выход:

Local script __FILE__: . 
External script __FILE__: /home/kenneth/Pictures/wp/rip_vault 

ответ

7

File.dirname должен возвращать абсолютный путь, если дан абсолютный путь, а относительный путь, если данный относительный путь:

File.dirname('/home/jon/test.rb') # => '/home/jon' 
File.dirname('test.rb') # => '.' 

__FILE__ возвращает имя текущего скрипта, который поэтому относительный путь из текущего каталога. Это означает, что вы должны всегда использовать expand_path, если хотите получить абсолютный путь с File.dirname(__FILE__).

NB рубин 2.0.0 introduces the __dir__ constant

+0

Да, это объясняет. И извлеченный урок будет заключаться в том, что вызов скриптов из других скриптов делает __FILE__ абсолютным путем. Думаю, это кажется достаточно разумным. – Kenneth

3

Если вы уже перешли на Ruby 2.0, вы можете использовать новую константу

__dir__ 

иначе вы можете использовать

File.expand_path('..', __FILE__) 

, которая короче чем

File.expand_path(File.dirname(__FILE__)) 

File.expand_path documentation

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