当我向手册询问哪个命令时,我得到了这样的答案:
如果其参数在严格符合 POSIX 规范的 shell 中作为命令给出,则返回将在当前环境中执行的文件(或链接)的路径名。它通过在 PATH 中搜索与参数名称匹配的可执行文件来实现此目的。它不会规范化路径名。
我第一次听说“规范路径”。我在 stackoverflow 上找到了一个明确的定义
给出的例子如下
绝对路径:C:\abc..\abc\file.txt
规范路径:C:\abc\file.txt
不难看出两者的区别,但实际上谁会使用第一条路径而不是第二条路径呢?这样做有什么意义呢?换句话说,使用一条未经规范化的路径有什么意义呢?
PS:我刚刚意识到这两个示例适用于 Windows;也许不是我的问题的最佳选择。
最佳答案
3
对我来说,有一个实际的例子,即路径+文件名具有非规范形式。
假设有两个变量A1
和B1
。每个变量都包含路径的一部分,但第二个变量具有相对(某些)路径,另一个变量具有驱动器和目录:
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
是相对的或包含符号链接。
|
|