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

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

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

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

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

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

答案1

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

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

相关内容