6

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

File.dirname(__FILE__)

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

Ruby Doc在其示例中列出了绝对返回路径,而我在Ruby 论坛上找到了一个讨论,用户说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
4

2 回答 2

9

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引入了__dir__常量

于 2013-03-12T10:31:48.700 回答
4

如果你已经升级到Ruby 2.0,你可以使用新的常量

__dir__

否则你可以使用

File.expand_path('..', __FILE__)

File.expand_path(File.dirname(__FILE__))

File.expand_path 文档

于 2013-03-12T10:33:35.887 回答