路径语法规则

Mat*_*hid 11 directory filenames

我正在编写一个用于操作 Unix 路径字符串的库。既然如此,我需要了解大多数人不会担心的语法的一些晦涩的角落。

例如,作为最好的,我可以告诉大家,似乎foo/barfoo//bar都指向同一个地方。

此外,~通常代表用户的主目录,但如果它出现在路径中间呢?那会发生什么?

如果我要编写正确处理每种可能情况的代码,这些以及其他几十个晦涩的问题需要回答。有人知道解释这些东西的确切语法规则的权威参考吗?

(不幸的是,搜索诸如“Unix 路径语法”之类的术语只会出现一百万页讨论$PATH变量……哎呀,我什至在努力为这个问题找到合适的标签!)

Sté*_*las 13

有三种类型的路径:

  • 相对路径,如foo, foo/bar, ../a, .。它们不以/并相对于使用该路径进行系统调用的进程的当前目录开始。
  • 绝对路径,如/,/foo/bar///x。它们以 1 或 3 或更多开头/,它们不是相对的,从/根目录开始查找。
  • POSIX 允许//foo被特殊对待,但没有具体说明如何对待。某些系统将其用于特殊情况,例如网络文件。它必须正好是 2 个斜线。

除了在开始时,斜线序列就像一个斜线。

~仅对 shell 特殊,它由 shell 扩展,它对系统根本没有特殊性。它的扩展方式取决于 shell。Shell 执行其他形式的扩展,例如通配 ( *.txt) 或变量扩展/$foo/$bar或其他形式。就系统而言,~foo它只是一个相对路径,如_foofoo

需要注意的事项:

  • foo/不一样foo。对于大多数系统上的大多数系统调用,它foo/.foo(尤其foo是符号链接)更接近(就像是foo//一样foo/)。
  • a/b/../c不一定与a/c(例如 ifa/b是符号链接)相同。最好不要..特殊对待。
  • 考虑a/././././b相同的情况通常是安全的a/b