路径语法规则

路径语法规则

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

例如,据我所知,似乎foo/barfoo//bar都指向同一个地方。

另外,~通常代表用户的主目录,但是如果它出现在中间一条路径?然后会发生什么?

如果我要编写正确处理每种可能情况的代码,就需要回答这些问题和其他几十个晦涩的问题。有谁知道解释的明确参考资料精确的这个东西的语法规则?

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

答案1

路径分为三种类型:

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

除了开头之外,一系列斜线的作用与斜线相同。

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

要记住的事情:

  • foo/不等于foo.对于大多数系统上的大多数系统调用来说,它foo/.更接近于foo(特别是如果foo是符号链接)(foo//与虽然相同foo/)。
  • a/b/../c不一定相同a/c(例如 ifa/b是符号链接)。最好不要..特殊对待。
  • 一般来说,考虑a/././././b同样的事情是安全的a/b

答案2

例如,据我所知, foo/bar 和 foo//bar 似乎都指向同一个地方。

是的。这很常见,因为软件有时会假设第一部分没有以正斜杠终止,因此会连接路径,因此会添加一个以确保(意味着最终可能有两个或更多)。foo///bar并且foo/////bar也指向与 相同的地方foo/bar。路径操作库的一个不错的功能是将任意数量的连续斜杠减少到一个(除了在路径的开头,它可以以类似 URL 的方式使用,或者,正如 Stephane 指出的那样,对于任何未指定的特殊目的)。

另外,~通常代表用户的主目录

该转换是通过 shell 完成的波浪号扩展,仅当它是路径中的第一个字符时才有效。您是否需要处理这个问题取决于上下文。如果该库要与接收例如包含路径的命令行参数的普通程序一起使用,则波形符扩展为已经完成了当他们看到那条路时。我认为值得关注的唯一情况是您是否直接从文本文件处理路径。

除此之外,它~是 *nix 路径中的合法字符,不应更改为其他任何字符。作为根据这个,在 unix 文件名中唯一不合法的字符是/(因为它是路径分隔符)和“null”(又名零字节),因为它们通常在文本中是非法的。

相关内容