我有一个用于构建特定风格的 GCC 交叉编译器的脚本。在整个脚本中,有许多路径不是规范形式的,例如重复路径分隔符 ( /xxx/foo//bar/yyy
) 和中间的“this”目录 ( /xxx/foo/./bar/yyy
)。
我正打算将它们全部规范化,但我想知道这些形式是否重要,而不仅仅是脚本未被清理的情况。除了刚才提到的形式之外,我还很好奇在路径中包含“up 目录”在任何特定情况下是否也很重要(即“而/xxx/foo/../bar/yyy
不是” /xxx/bar/yyy
)。例如,我遇到了类似/xxx/foo/.//bar/yyy
.
我能想到的唯一可能的情况是涉及链接时。我可以想象该..
表单的行为可能会有所不同,但是上面的其他两种表单又如何呢?
也许还有特定于平台的原因以这种方式构建路径..?
答案1
/./
你应该总是能够崩溃到/
。
//
通常应该是可折叠的,但我已经看到配置脚本检查它,所以我假设可能存在不一样的系统。检查一下,但可能会没事的。
/../
仅当前面的目录不是符号链接(或者我相信不是硬链接)时才有效。由于..
是到其父目录的硬链接,因此它将转到该分支,而不是您使用的文本路径中的分支。 (注意,您的 shell 可能设置为不解析cd
s 上的符号链接,在这种情况下,它将进入符号链接所在的目录;但是,此行为几乎完全限于cd
设置了此选项的 shell 内。)
使用readlink -f "$path"
,我相信它会妥善解决所有这些情况。