符号链接文件后,如何在Ruby中获取原始文件的路径?

时间:2011-12-16 19:36:33

标签: ruby symlink

我有一个路径为/foo/bar/gazook/script.rb的Ruby脚本。我还在$HOME/bin中创建了一个符号链接。

现在,我希望我的Ruby脚本访问目录/foo中的其他文件,并且为了保持路径相对,我的脚本中有一个变量FOO_DIRECTORY = File.expand_path(File.dirname(__FILE__) + "/../../")

问题是如果我从它的符号链接运行我的脚本,这个相对目录是错误的(因为我猜它从不同的位置扩展)。

我该如何解决这个问题?除了使用绝对路径之外还有其他方法吗?

4 个答案:

答案 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__)