文件系统路径的非规范化形式是否重要?(例如“foo//bar”、“foo/./bar”和“foo/../bar”)

Cro*_*ror 5 filesystems path symlink filenames files

我有一个用于构建特定风格的 GCC 交叉编译器的脚本。在整个脚本中,有许多不是规范形式的路径,例如重复的路径分隔符 ( /xxx/foo//bar/yyy) 和中间的“this”目录 ( /xxx/foo/./bar/yyy)。

我正准备将所有这些规范化,但我想知道这些形式是否重要,而不仅仅是脚本未被清理的情况。除了刚才提到的形式之外,我还很好奇在路径中包含“up 目录”是否在任何特定情况下也很重要(即“/xxx/foo/../bar/yyy而不是 ” /xxx/bar/yyy)。例如,我遇到了像/xxx/foo/.//bar/yyy.

我能想到的唯一潜在情况是涉及链接时。我可以想象..表单的行为可能会有所不同,但是上面的其他两种表单呢?

也许以这种方式构建路径也有特定于平台的原因..?

Kev*_*vin 2

/./你应该总是能够崩溃到/
//通常应该是可折叠的,但我已经看到配置脚本检查它,所以我假设可能存在不一样的系统。检查一下,但可能会没事的。
/../仅当前面的目录不是符号链接(或者我相信不是硬链接)时才有效。由于..是到其父目录的硬链接,因此它将转到该分支,而不是您使用的文本路径中的分支。(注意,您的 shell 可能设置为不解析cds 上的符号链接,在这种情况下,它将进入符号链接所在的目录;但是,此行为几乎完全限于cd设置了此选项的 shell 内。)

使用readlink -f "$path",我相信它会妥善解决所有这些情况。