我使用Ruby 1.9.3编写了几个用于系统管理的小Ruby脚本.在一个脚本中我使用:
File.dirname(__FILE__)
Run Code Online (Sandbox Code Playgroud)
获取脚本文件的目录.这将返回一个相对路径,但是当我从第二个脚本调用脚本时,File.dirname返回一个绝对路径.
Ruby Doc在其示例中列出了绝对返回路径,而我在Ruby论坛上发现了一个讨论,其中用户说dirname应该只返回相对路径.
我使用Ruby Forums建议的解决方案来使用File.expand_path总是得到这样的绝对路径:
File.expand_path(File.dirname(__FILE__))
Run Code Online (Sandbox Code Playgroud)
但有没有办法使行为dirname一致?
更新:
为了扩展Janathan Cairs的答案,我制作了两个脚本:
s1.rb:
puts "External script __FILE__: #{File.dirname(__FILE__)}"
Run Code Online (Sandbox Code Playgroud)
s0.rb:
puts "Local script __FILE__: #{File.dirname(__FILE__)}"
require './s1.rb'
Run Code Online (Sandbox Code Playgroud)
运行./s0.rb会给出以下输出:
Local script __FILE__: .
External script __FILE__: /home/kenneth/Pictures/wp/rip_vault
Run Code Online (Sandbox Code Playgroud)
File.dirname 如果给定绝对路径,则应返回绝对路径;如果给定相对路径,则返回相对路径:
File.dirname('/home/jon/test.rb') # => '/home/jon'
File.dirname('test.rb') # => '.'
Run Code Online (Sandbox Code Playgroud)
__FILE__返回当前脚本的名称,因此是当前目录的相对路径.这意味着expand_path如果你想获得绝对路径,你应该总是使用File.dirname(__FILE__).
NB Ruby 2.0.0 引入了__dir__常量