【问题标题】:After symlinking a file, how do I get the path of the original file in Ruby?对文件进行符号链接后,如何在 Ruby 中获取原始文件的路径?
【发布时间】:2019-03-09 02:11:58
【问题描述】:

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

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

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

我该如何解决这个问题?除了使用绝对路径还有什么办法吗?

【问题讨论】:

    标签: ruby symlink


    【解决方案1】:

    您可以使用File.readlink 来解析符号链接,但您需要先检查File.symlink?

    path = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
    

    然后您可以使用path 而不是__FILE__。您可能还想使用$0 而不是__FILE____FILE__ 是当前文件名,而$0 是当前脚本的名称。

    【讨论】:

    • 对于更通用的解决方案,您需要在循环中解析符号链接,因为一个符号链接可能指向另一个符号链接。另外,您必须检查路径的每个部分:bin 也可能是符号链接。我推荐File.realpath
    【解决方案2】:

    要获取相对于脚本位置的任何路径,总是使用__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__))

    【讨论】:

      【解决方案3】:

      试试这个

      require 'pathname'
      p File.dirname(Pathname.new(__FILE__).realpath)
      

      【讨论】:

        【解决方案4】:

        试试这个:

        FOO_DIRECTORY = File.expand_path("../../../", __FILE__)
        

        我说问题在于您的符号链接文件正在解释 File.dirname(__FILE__)

        【讨论】:

        猜你喜欢
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多