混淆File.dirname的行为

时间:2013-03-12 10:25:41

标签: ruby

我使用Ruby 1.9.3编写了几个用于系统管理的小型Ruby脚本。在一个脚本中我使用:

File.dirname(__FILE__)

获取脚本文件的目录。这将返回一个相对路径,但是当我从第二个脚本File.dirname调用脚本时,返回一个绝对路径。

Ruby Doc在其示例中列出了绝对返回路径,而我在Ruby Forum上发现了一个讨论,其中用户说dirname应该只返回相对路径。

我正在使用Ruby论坛建议的解决方案来使用File.expand_path总是得到这样的绝对路径:

File.expand_path(File.dirname(__FILE__))

但有没有办法让dirname的行为保持一致?


更新:

为了扩展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

2 个答案:

答案 0 :(得分:7)

如果给定绝对路径,

File.dirname应返回绝对路径,如果给定相对路径,则返回相对路径:

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

__FILE__返回当前脚本的名称,因此它是当前目录的相对路径。这意味着如果您希望获得expand_path的绝对路径,则应始终使用File.dirname(__FILE__)

NB Ruby 2.0.0 introduces the __dir__ constant

答案 1 :(得分:3)

如果您已升级到Ruby 2.0,则可以使用新常量

__dir__

否则你可以使用

File.expand_path('..', __FILE__)

短于

File.expand_path(File.dirname(__FILE__))

File.expand_path documentation