在 Ruby 上使用相对路径进行文件引用

问题描述 投票:0回答:1

我刚刚完成了一台CTF机器,但我的大脑很难弄清楚为什么它会起作用,所以我想问一下,因为在我知道之前我将无法入睡!我的问题是关于相对路径的使用。

下面是 Ruby 脚本的源代码,其中包含

list_from_file
函数,该函数使用相对路径来读取
dependencies.yml
文件。

henry@precious:~$ cat /opt/update_dependencies.rb
# Compare installed dependencies with those specified in "dependencies.yml"
require "yaml"
require 'rubygems'

# TODO: update versions automatically
def update_gems()
end

def list_from_file
    YAML.load(File.read("dependencies.yml"))
end

def list_local_gems
    Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.map{|g| [g.name, g.version.to_s]}
end

gems_file = list_from_file
gems_local = list_local_gems

gems_file.each do |file_name, file_version|
    gems_local.each do |local_name, local_version|
        if(file_name == local_name)
            if(file_version != local_version)
                puts "Installed version differs from the one specified in file: " + local_name
            else
                puts "Installed version is equals to the one specified in file: " + local_name
            end
        end
    end
end

我有限的知识推断,当我执行此脚本时,它只会搜索以在与脚本相同的目录中查找dependencies.yml

文件,在本例中为
/opt/

然而,事实并非如此!当我在

/tmp

 目录中创建此文件,然后运行脚本时,它实际上会拾取它!

我搜索并阅读了一些文章以及其他关于

相对路径与绝对路径 的 stackoverflow 帖子,但没有一个真正解释了为什么会发生这种情况。

如果我错过了任何密切相关的帖子,我提前表示抱歉!

ruby directory path relative-path
1个回答
0
投票
Ruby 中的相对路径始终依赖于

当前工作目录。当前工作目录不一定与脚本所在的目录相同,而是启动 Ruby 时所在的目录

示例:

> cd /tmp > ruby /some/path/somewhere/to/my/script.rb
在这种情况下

script.rb

的当前工作目录是什么?

答案:是

/tmp

,因为那是你启动脚本时所在的目录。

要从脚本本身显示当前工作目录,您可以添加一行

puts Dir.pwd

,脚本将打印出当时正在哪个文件夹中运行。

要更改脚本的当前工作目录,可以使用

Dir.cwd

您可以看到为什么使用相对路径很容易导致混乱,因为这完全取决于 Ruby 可执行文件的启动目录。它可能在任何地方。

这就是为什么大多数脚本使用

绝对路径相对于脚本文件本身的路径。要使用相对于脚本文件本身的路径,您可以使用 __dir__

 作为起点,并从那里构建脚本相对路径。

在这里查看更多讨论:


Ruby 脚本可以告诉它位于哪个目录吗?

© www.soinside.com 2019 - 2024. All rights reserved.