路径语法规则


10

我正在编写一个用于处理Unix路径字符串的库。在这种情况下,我需要了解大多数人不会担心的语法的一些晦涩之处。

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

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

如果我要编写能够正确处理所有可能情况的代码,则需要回答这些以及其他几十个晦涩的问题。有人知道一个明确的参考资料来解释该材料的确切语法规则吗?

(不幸的是,搜索“ Unix路径语法”之类的词时,讨论该$PATH变量的页面只有一百万页。


ok〜tilde和-filename扩展是任何Unix环境的基础POSIX定义的功能。一些提示:一个文件名可以是任何东西,但\ 0或/。//////和/是同一件事。$ PWD在内核中处理,并且可以在/ proc中的任何(Linux)进程中读取。/./ 只能出现在路径的根。在$ PATH :::::和:中是同一件事。/ dev / null / dev / tty和/ tmp是每个符合标准的系统的POSIX保证路径。
mikeserv

1
您的大部分问题(但不是有关的部分~)在linux如何处理多个路径分隔符(/ home /////用户名/// file)中进行了介绍。与规范性引用最接近的是POSIX或Single Unix规范 -不易阅读。
吉尔斯(Gilles)'所以

Answers:


13

共有三种类型的路径:

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

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

~仅对shell特殊,由shell扩展,对系统完全不特殊。它的扩展方式取决于外壳。Shell执行其他形式的扩展,例如globlob(*.txt)或变量扩展/$foo/$bar或其他形式。就系统而言~foo,只是一个相对路径,例如_foofoo

注意事项:

  • foo/与相同foo。对于大多数系统上的大多数系统调用,它foo/.foo(特别是如果foo是符号链接)更近(与之foo//相同foo/)。
  • a/b/../c不一定与a/c(例如,如果a/b是符号链接)相同。最好不要..特别对待。
  • 通常可以认为a/././././b相同a/b

因此,在总结,如果我不关心shell路径操作(这是庞大而复杂的),我只需要关心/...(?)
MathematicalOrchid

//fooCygwin 就是处理的一个例子,它用于UNC路径。也就是说,//server/share/dir/file.txt默认情况下是指向系统外的合法路径。如果Cygwin无法找到本地系统,它肯定会退一步server
沃伦·杨

3

例如,据我所知,似乎foo / bar和foo // bar都指向同一位置。

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

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

该转换通过shell和tilde扩展完成,仅当它是路径中的第一个字符时才起作用。是否需要处理此问题取决于上下文。如果该库与接收例如包含路径的命令行参数的普通程序一起使用,则波浪号扩展在它们看到路径时就已经完成。我能看到的唯一问题就是您是否正在直接从文本文件处理路径。

除此之外,它~是* nix路径中的合法字符,不应更改为其他任何字符。由于每本,这是不合法的UNIX文件名的唯一字符是/(因为它是路径分隔符)和“空”(亦称零字节),因为他们是在非法的文字一般。


+1用于解释代字号扩展;我不知道您可以用它来推荐其他用户!
MathematicalOrchid

2
正如史蒂芬(Stephane)所说,您不能盲目地折叠所有重复的正斜杠。路径开始处的多个正斜杠必须仔细处理。
沃伦·杨

@WarrenYoung编辑清楚。PS。向前??!O_O
goldilocks 2014年

更好,尽管我不会说这与URL有关。UNC可以追溯到1980年代后期,而URL直到几年后才出现。
沃伦·杨

@WarrenYoung足够公平,尽管看起来UNC 是特定于MS平台的,但从//技术上讲也不是。URL和更新,根据对SC自由的暧昧POSIX规范// 可能已经从这些得出,在这种情况下,“URL十岁上下”似乎是一个贴切的标签公约(即使的UNC是年龄大了,即使外表是无意的)。我永远不会说“他们是URLS”,仅是说//\\ 达到“ URL-ish”目的。
goldilocks 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.