我有一个路径为/foo/bar/gazook/script.rb
的Ruby脚本。我还在$HOME/bin
中创建了一个符号链接。
现在,我希望我的Ruby脚本访问目录/foo
中的其他文件,并且为了保持路径相对,我的脚本中有一个变量FOO_DIRECTORY = File.expand_path(File.dirname(__FILE__) + "/../../")
。
问题是如果我从它的符号链接运行我的脚本,这个相对目录是错误的(因为我猜它从不同的位置扩展)。
我该如何解决这个问题?除了使用绝对路径之外还有其他方法吗?
答案 0 :(得分:12)
您可以使用File.readlink
来解析符号链接,但是您需要先检查File.symlink?
。
path = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
然后,您可以使用path
代替__FILE__
。您可能也想使用$0
而不是__FILE__
,__FILE__
是当前文件名,而$0
是当前脚本的名称。
答案 1 :(得分:5)
要获取相对于脚本位置的任何路径,始终使用__dir__
。
__dir__
简洁明了File.dirname(File.realpath(__FILE__))
。它在Ruby> = 2.0中可用。 On __dir__
File.realpath(__FILE__)
相比, Pathname#realpath
(或File.readlink
)有三个优势:
readlink
仅扩展作为参数最后部分的路径。readlink
仅解析第一级。path
是否为符号链接。因此,您可以删除if File.symlink?
。因此,最好使用FOO_DIRECTORY = File.join(__dir__, '..', '..')
或FOO_DIRECTORY = File.dirname(File.dirname(__dir__))
答案 2 :(得分:2)
试试这个
require 'pathname'
p File.dirname(Pathname.new(__FILE__).realpath)
答案 3 :(得分:-2)
试试这个:
FOO_DIRECTORY = File.expand_path("../../../", __FILE__)
我说问题是您的符号链接文件正在解释File.dirname(__FILE__)