当我向手册询问哪个命令时,我得到了这样的答案:

如果其参数在严格符合 POSIX 规范的 shell 中作为命令给出,则返回将在当前环境中执行的文件(或链接)的路径名。它通过在 PATH 中搜索与参数名称匹配的可执行文件来实现此目的。它不会规范化路径名。

我第一次听说“规范路径”。我在 stackoverflow 上找到了一个明确的定义
给出的例子如下

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

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

不难看出两者的区别,但实际上谁会使用第一条路径而不是第二条路径呢?这样做有什么意义呢?换句话说,使用一条未经规范化的路径有什么意义呢?

PS:我刚刚意识到这两个示例适用于 Windows;也许不是我的问题的最佳选择。


最佳答案
3

对我来说,有一个实际的例子,即路径+文件名具有非规范形式。

假设有两个变量A1B1。每个变量都包含路径的一部分,但第二个变量具有相对(某些)路径,另一个变量具有驱动器和目录:

A1="C:\abc"
B1="..\abs\file.txt"

为了获得完整路径,你将它们连接起来并得到

C:\abc\..\abc\file.txt

对于 Linux 来说则是:

A1="/abc"
B1="../abc/file.txt"
P="$A1"/"$B1"

结果如下:

/abc/../abc/file.txt

2

  • 1
    我相信 A1 应该"/abc"在您的 Linux 示例中。它不允许我编辑,因为编辑长度少于六个字符。


    – 

  • @Hearth,你说得对 🙂 已编辑


    – 

规范化的一个问题是,当涉及符号链接时,它具有时间依赖性。

因此,如果符号链接发生变化,您的规范路径可能会指向错误的文件,但它可以很好地处理非规范路径。

非规范路径最重要的一点是处理符号链接和相对路径。路径规范化明确解析路径中的所有间接路径,包括符号链接(路径的最后一部分是悬空符号链接,这是个特殊例外)、..条目、.条目,以及理论上操作系统为路径间接路径提供的任何其他内容(以及对相邻路径分隔符进行重复数据删除)。根据执行规范化的操作,它还可以正确解析路径的相对基数以使其成为绝对路径(这通常是可取的,但并非总是如此)。这意味着规范路径是用于生成它的非规范路径指向的时间点快照,但不能保证它在过去或将来的任意时间点都相同(因为它可能取决于所涉及的任何符号链接,也可能取决于路径解析时的当前工作目录)。

对于 的特定情况which,它报告的非规范形式还有另一个理想的属性:它包含$PATH找到所请求二进制文件的条目。这样您就可以确定 的哪一部分$PATH使二进制文件可用,即使 的这一部分$PATH是相对的或包含符号链接。