什么是"规范路径"?

Met*_*iel 69 theory path relative-path absolute-path

这是一个理论问题.我在互联网上搜索没有令人满意的运气,我只想了解这个术语是什么.我已经看过Java,JSON等的例子但是我在谷歌或者StackOverflow中找不到一个简单的解释,没有代码需要= P

因此,绝对路径是一种到达某个文件或位置的方式,描述它的完整路径,完整路径,以及它依赖于操作系统(例如,Windows和Linux的绝对路径是不同的)相对路径它是一个路由到从当前位置描述的文件或位置..(两个点)表示目录树中的高级别.我已经清楚这几年了.

搜索时我甚至看到有规范化的文件!我所知道的就是"CANONICAL"意味着"根据规则"之类的东西.

有人可以请理解关于规范的理论吗?=)感谢!!

PD(所以它毕竟不仅仅是一个Ubuntu随机名称)XD

PD2可悲的是我不能给每个人答案,我把它给了帮助我最了解这个概念的那个,但是非常感谢每个人=)

Ker*_* SB 84

制作任何 "规范"的重点是你可以比较两件事.例如,两者../../here/bar/x./test/../../bar/x可能指的是同一个位置,但你不能做两个路径上的文本比较.但是,如果你将它们变成规范表示,它们都变成了../bar/x,我们看到它们实际上指的是同一个东西.

简而言之,通常情况下,您有很多方法可以引用一件事,在这种情况下,您可以定义一个独特规范表示,并允许您处理此类事物的集合.

(如果你正在寻找更多的例子,所有的数学都充满了各种对象的"规范"结构,并且在很大程度上也有同样的目的.也许这篇维基百科文章可以提供一些额外的指示.)

  • @Metafaniel:规范的相对路径将相对于给定的固定工作目录。*相对于给定目录,您可以形成唯一的相对路径。但您只能比较同一工作目录的那些。相比之下,规范绝对路径可以在全局范围内进行比较。 (3认同)
  • 一切都很好,直到那个评论 xD OK 我明白了,但是......规范的相对路径?据我所知,到目前为止(谢谢大家)规范路径本质上是绝对的。关于规范的相对路径,您能告诉我什么吗?=谢谢=) (2认同)

alf*_*sin 21

定义规范路径的好方法是:( the shortest absolute path简称,字符串长度的含义).

这是绝对路径和规范路径之间差异的示例:

绝对路径: C:\abc\..\abc\file.txt
规范路径:C:\abc\file.txt

  • @alfasin:Microsoft似乎不同意您的断言,即Windows API函数[PathCanonicalize]证明了“ Windows中没有规范的路径”(https://msdn.microsoft.com/zh-cn/library/windows /desktop/bb773569(v=vs.85).aspx)。尽管Windows通常不会在路径中强制区分大小写(尽管它取决于卷),但Windows确实会保留路径中每个字符的大小写,即使它允许不区分大小写的访问也是如此。无论如何,我的观点仍然是,最短的绝对路径不一定是规范的。 (2认同)
  • @DanKorn 告诉他们与 [规范的定义](https://en.wikipedia.org/wiki/Canonical) 争论。至于你的不同意见,你可能是对的,但我还没有看到一个*好的*反例;) (2认同)
  • @alfasin:在我看来,除了字典定义之外,微软还可以定义他们自己的术语在他们自己的操作系统和API中的含义.关于Windows中的规范是谁比谁更高?为什么"C:\ PROGRA~1"不是一个很好的反例,你的断言最短路径是定义的规范? (2认同)
  • @DanKorn对微软的所有应有的尊重(我*尊重他们)他们没有定义规范的含义.规范意味着"独特"或"独特的代表".由于Windows操作系统不区分大小写,因此根据定义,任何路径都不能有单一的唯一表示形式.它可以是绝对的,但不是规范的.如果这个推理对你来说看起来不合理,你可以不同意,但由于这个讨论变得徒劳无益(我不断重复和解释我的话),让我们在这里削减并同意不同意. (2认同)

tla*_*e29 10

GNU Coreutils的文档中给出了规范路径的良好定义readlink。指定“规范化模式”返回不包含以下任何内容的等效路径:

  1. 到自身 (.) 和父 (..) 目录的硬链接
  2. 重复分隔符 (/)
  3. 符号链接

字符串长度无关紧要,如以下示例所示。

如果您运行的是 Linux 或正在使用 GNU Coreutils,您可以尝试使用readlink -f(规范化模式)或其首选等效命令,以查看系统上某些程序的“绝对路径”和“规范绝对路径”之间的区别。realpath

我可以使用以下命令获取系统上“java”的路径which

$ which java
/usr/bin/java
Run Code Online (Sandbox Code Playgroud)

然而,该路径实际上是到另一个符号链接的符号链接。该符号链接链可以使用 显示namei

$ namei $(which java)
f: /usr/bin/java
 d /
 d usr
 d bin
 l java -> /etc/alternatives/java
   d /
   d etc
   d alternatives
   l java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java
     d /
     d usr
     d lib
     d jvm
     d java-17-openjdk-amd64
     d bin
     - java
Run Code Online (Sandbox Code Playgroud)

可以使用前面提到的命令找到规范路径realpath

$ realpath $(which java)
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
Run Code Online (Sandbox Code Playgroud)


Cra*_*lus 6

规范路径(或其与绝对路径的差异)取决于系统.
通常,如果(完整)路径包含别名,快捷方式或符号链接,则规范路径会将所有这些路径解析为它们引用的实际目录.
示例:如果/bin/a是sym链接,您可以在请求绝对路径的任何位置找到它,例如来自java.io.File#getAbsolutePath,而真实文件(即链接的实际目标)usr/local/bin/a即将作为规范路径返回,例如来自java.io.File#getCanonicalPath