虽然 OS X“是”一个 unix 操作系统,但它也从 Mac OS 9 派生了相当多的代码、API、标准等。在 unix 中,文件路径以“/”分隔元素,而“:”在单个文件和目录的名称。在 Mac OS 9 中,情况正好相反:文件路径在元素之间使用“:”,而在单个文件名中允许使用“/”。当 Apple 开发 OS X 时,他们最终不得不支持一些使用 unix 风格文件路径的 API,以及一些使用 OS 9 风格路径的 API,并且它们都必须能够在同一个文件系统上工作。
他们所做的是根据上下文交换分隔符和允许的字符。如果您编写(/运行)一个使用 unix API 访问文件系统的程序,您将看到文件名中带有冒号和斜线分隔路径元素的文件。如果您编写(/运行)一个使用旧的 OS 9 API(或其衍生产品)的程序,您会看到文件名中带有斜杠,而冒号分隔路径元素。有关更多讨论,请参阅Apple 的开发人员 Q&A #1392和有关在 AppleScript 中指定路径的说明。
(还有一些其他差异。unix 路径如果以分隔符(“/”)开头,则为绝对路径,绝对路径从根卷的顶部开始。OS 9 路径如果不开始,则为绝对路径使用分隔符,并且绝对 OS 9 路径以卷名开头。因此,unix 路径“/tmp/foo:bar”等价于 OS 9 路径“Macintosh HD:tmp:foo/bar”。)
那么,文件名中真正的字符是斜线还是冒号?好吧,文件名是一个相当抽象的东西,但是如果您询问实际存储在磁盘上的字节......如果它在 HFS+(又名 Mac OS 扩展)卷上,它被存储在一个文件系统中旨在与 OS 9(好吧,技术上是 Mac OS 8.1)API 一起使用,因此它允许斜杠但禁止冒号,因此在 HFS+ 卷上,文件将“真正”在名称中有斜杠。OTOH,如果您将文件存储在 unixish 卷上,它将使用 unix 约定存储,并且“真正”的名称中有一个冒号。但是除非您从磁盘读取原始字节或编写文件系统驱动程序,否则差异并不重要......
最后,为什么 Finder 将有争议的文件名字符显示为斜杠而不是冒号?我很确定这主要是惯性。Finder 对此甚至不完全一致,因为如果您使用其转到文件夹选项 (Command-Shift-G) 并输入“/Users/Shared”,它会将其视为 unix 路径。如果你输入“Macintosh HD:Users:Shared”,它不知道你在说什么。此外,如果您运行touch /tmp/foo:bar
,请尝试使用 Go To Folder 来访问它:
- 输入“/tmp/foo:bar”有效。
- 输入“/tmp/fo”,然后按 Tab 将其自动完成为“/tmp/foo/bar/”,这样就可以了。
- 输入 "/tmp/foo/bar/" 失败,即使它与自动完成功能完全相同。
- 输入“/tmp/foo”,然后按 tab 自动完成到“/tmp/foo/”,它不能再自动完成,根本不起作用。
更新:正如 Konrad Rudolph 所指出的,从 El Capitan 开始,Go To Folder 行为已经改变,我不再有任何方法可以使用它来访问包含有争议角色的文件夹。