2013-03-12 136 views
4

我已經編寫了幾個使用Ruby 1.9.3進行系統管理的小型Ruby腳本。在我使用的一個腳本中:令人困惑的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給出了以下內容

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

__FILE__返回當前腳本的名字,那就是:NG輸出:如果給的是相對路徑,如果給出一個絕對路徑

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

回答

7

File.dirname應該返回一個絕對路徑和相對路徑因此是當前目錄的相對路徑。這意味着如果您想通過File.dirname(__FILE__)獲得絕對路徑,則應始終使用expand_path

NB的Ruby 2.0.0 introduces the __dir__ constant

+0

是的,這解釋了它。然後所學到的教訓是從其他腳本調用腳本使__FILE__成爲絕對路徑。我想這似乎夠合理。 – Kenneth 2013-03-12 10:52:39