不同的编程语言如何处理相对路径?

时间:2018-11-29 00:00:15

标签: unix relative-path

我将从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指的是当前工作目录中的某个东西,而是在它没有之前找到{在当前工作目录中的{1}}中,相对于执行file.php的文件,它在includes中查找。似乎PHP如何处理相对路径有一个微妙的层次结构。

请注意,如果在require中有includes/test.php(前导require './file.php';之前只有一个“裸”文件路径),则它可以按预期的方式运行 IFF < / strong>“上” ./存在。也就是说,前导file.php不会加载./和致命错误。

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

我想知道的是,这仅仅是UNIX吗?它是在OS级别强制执行的,还是只是通过编程语言中的约定强制执行的?其他语言的行为是否有所不同?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

例如,PHP requireinclude_path的行为为documented in the official PHP manual

  

基于给定的文件路径或如果未给定的include_path包含文件。如果在include中找不到该文件,则require [和\]最终将在失败之前检入调用脚本自己的目录和当前工作目录。

     

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

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