我正在编写一个用于操作 Unix 路径字符串的库。既然如此,我需要了解语法中一些大多数人不会担心的晦涩难懂的角落。
例如,据我所知,似乎foo/bar
和foo//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”(又名零字节),因为它们通常在文本中是非法的。