【问题标题】:How do different programming languages treat relative paths?不同的编程语言如何处理相对路径?
【发布时间】:2018-11-29 00:00:15
【问题描述】:

我将从 PHP 中的一个示例开始。假设我有这样的文件结构:

.
└── includes
    ├── file.php
    └── test.php

并说我的代码如下所示:

// includes/test.php
require 'file.php';


// includes/file.php
echo 'SUBDIR';

现在,如果我运行 php includes/test.php,我会得到 SUBDIR 作为输出。这不足为奇。

但是假设我在./file.php 添加了一个文件,上面写着echo 'ROOT!';。现在我的树看起来像:

.
├── file.php
└── includes
    ├── file.php
    └── test.php

当我运行php includes/test 时,它会输出ROOT!。我觉得这有点令人惊讶。

当我想到它时,我感到惊讶的不一定是file.php 指的是当前工作目录中的某些东西,而是在它之前没有找到file.php在当前工作目录中,它查看了includes,相对于执行require 的文件。 PHP 处理相对路径的方式似乎有一个微妙的层次结构。

请注意,如果在 includes/test.php 我有 require './file.php'; 代替(前导 ./ 之前只有一个“裸”文件路径),它会按预期工作 IFF “上" file.php 存在。也就是说,带有前导 ./ 的它不会加载 includes/file.php 和致命错误。

实际上,所有这些都归结为:不要使用相对路径!请改用绝对路径!这不是我要问的。

我想知道的是,这只是 UNIX 的东西吗?它是在操作系统级别强制执行的,还是只是按照编程语言的约定?其他语言的行为是否不同?

谢谢。

【问题讨论】:

  • 你的include_path是什么?

标签: unix relative-path


【解决方案1】:

它从来不是(或至少,很少)操作系统的事情;大多数(也许是所有)操作系统都有一个固定的解析相对路径名的不可变方法。它几乎总是语言的东西或实现的东西。也就是说,行为记录在语言标准或实施手册中。

例如PHPincluderequire的行为是documented in the official PHP manual

根据给定的文件路径包含文件,如果没有给出,则根据指定的include_path。如果在include_path 中找不到该文件,include [和require] 最终会在失败前检入调用脚本自己的目录和当前工作目录。

如果定义了路径——无论是绝对路径(在 Windows 上以驱动器号或 \ 开头,在 Unix/Linux 系统上以 / 开头)还是相对于当前目录(以 ... 开头) — include_path 将被完全忽略。例如,如果文件名以../ 开头,则解析器将在父目录中查找请求的文件。

当然,其他语言的做法不同。例如,在 C 和 C++ 中,#include 指令由预处理步骤处理;这些语言的标准明确规定搜索要包含的文件是实现定义的;实际的搜索规则由特定的编译器定义和记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 2018-05-10
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2011-01-29
    相关资源
    最近更新 更多