// foo / bar在什么系统上与/ foo / bar不同?


114

在整个POSIX规范,有规定(123 ...),以允许实施治疗路径开始有两个/特别。

POSIX应用程序(编写为POSIX规范以移植到所有POSIX兼容系统的应用程序)不能假定//foo/bar与相同/foo/bar(尽管可以假定///foo/bar与相同/foo/bar)。

现在,那些//foo特别对待的POSIX系统(历史的和仍在维护的)是什么?我相信(现已证明错了),POSIX规定已由Microsoft推销为其Unix变体(XENIX)以及Windows POSIX层(有人可以确认吗?)。

Cygwin使用它,它也是Microsoft Windows的类似于POSIX的层。是否有任何非Microsoft Windows系统?OpenVMS?

//foo/bar特殊的系统上,它的用途是什么?//host/path用于网络文件系统访问?虚拟文件系统?

如果某些运行在类Unix之类的应用程序(如果不是系统的API)上的应用程序是否对//foo/bar路径进行了特殊处理(在它们被/foo/bar视为文件系统路径的情况下)?


编辑,此后,我在奥斯汀小组邮件列表上询问了//foo/bar有关规范中处理起源的问题,并且该讨论是有趣的阅读(至少从考古学角度而言)。



1
@OlivierDulac,编号ls -ld ///也将显示///ls仅显示被告知要显示的文件。我正在寻找像Cygwin一样特别对待// foo / var(而不是文件系统上的路径)的系统或应用程序。
斯特凡Chazelas

1
正如您提到的,标准(pubs.opengroup.org/onlinepubs/009695399/basedefs/…)表示,“以两个连续的斜杠开头的路径名可能会以实现定义的方式进行解释”(超过2个解析为1 /) 。网上有一个例子:austingroupbugs.net/view.phpIBM's z/OS resolves //pathname requests to MVS datasets (as opposed to the hierarchical filesystem (HFS)) (......) Additionally, z/OS would not accept or recognize additional "directory" or "file" components appended to such paths. ? id=83(...并非完全是unix,尽管^^)。
奥利维尔·杜拉克

4
@DevSolar:真的很有趣(而且令人惊讶),但是我们应该只坚持使用POSIX,因为在POSIX中一切皆有可能^^
Olivier Dulac

2
@edwardtorvalds因为第一位是网址:file://,都以http://和这样的。在Chrome在这里工作在Windows UNC路径,我已经打开,现在是file:////$MACHINE/$SHARENAME/index.html(虽然由于某种原因,也明白file://$MACHINE/...
admalledd

Answers:


90

这是到目前为止给出的答案的汇总和索引。这篇文章是社区Wiki,拥有100多个声誉的任何人都可以编辑,并且没有人从中获得声誉。随时发布您自己的答案,并在此处添加链接(或等待我来做)。理想情况下,此答案应该只是一个摘要(简短输入,而其他各个答案将包含详细信息)。

当前积极维护的系统:

退役系统

//foo/bar专门处理路径的应用程序


3
//一些Linux内核开发人员针对Reiser4的元数据功能提出了使用名称空间的建议,但我认为该提议从未在Namesys中引起关注,也从未实现过。
约尔格W¯¯米塔格

Windows本身实现POSIX API ...如何处理前导双斜杠?
凯文(Kevin)

1
我们可以在Web上添加,以双斜杠开头的资源定义的根不同于单斜杠。
Alex Gittemeier

@Kevin,是的,我也相信它(请参阅问题),尽管我认为它是可选组件,并且仅在Windows的某些变体上现已停用。如果您有更多详细信息,请添加答案。
斯特凡Chazelas

@AlexGittemeier。是的,您会注意到它实际上已在此答案中使用 ;-)。
斯特凡Chazelas

16

运行在类Unix之类的应用程序(如果不是系统的API)上是否专门处理// foo / bar路径?

我知道Perforce使用//depot/A/B/C/D路径来引用软件仓库。//Client/C/D当客户端指向时,Perforce还支持路径//depot/A/B/。在这里,本地文件系统可能没有这些路径。

p4 filelog //depot/A/B/C/D即使没有file也将显示该文件的历史记录/depot/A/B/C/D

p4 filelog C/D 如果从适当的目录执行,还将显示该文件的历史记录。

参考:https : //www.perforce.com/perforce/r12.1/manuals/cmdref/o.fspecs.html


13

几十年前,泰克 Utek(基于BSD 4.2的Unix,首先在National Semiconductors 32016 CPU上,然后在Motorola 68020上)提供了一种称为DFS(分布式文件系统)//foo/bar/bar文件,该文件指的是foodfs服务器上的文件。后来被Sun的NFS淘汰了。

不幸的是,我还没有提供支持,但是最终我可能会在酒窖中找到一些Utek文档并更新此回复。



@StéphaneChazelas我相信与Usenet讨论的链接会更好。您选择的是Domain / OS,而不是Utek。或下一封邮件(来自您的邮件


泰克/ BSD RFS实现显然将远程文件系统安装在常规文件上,以避免find例如遍历安装点。笔者明确规则出//foo/bar(或纽卡斯尔连接的/../foo/bar)有
斯特凡Chazelas


7

继铅从这个答案。并从Bitsavers的手册中阅读第2-15页(感谢@grawity)。

共享数据
Domain / OS分布式文件系统的第二个设计原理(默认情况下为共享)意味着全局统一的名称空间。对于用户而言,分布式文件系统的名称空间就像巨型分时共享文件系统的名称空间一样。它是传统的UNIX层次结构名称空间,除了绝对路径名可以以网络根名称(称为//)开头。也可以表示相对于本地节点的根(/目录)的路径名。

还有一本较旧的手册,带有“第一次印刷:1985年7月”。在第1-4页上:

图1-2中的双斜杠(//)代表命名树的顶层,即网络根目录。

因此,我们已经确认Apollo的Domain / OS //用于网络根。


我认为这位有才的家伙是Linux的主要开发者
mikeserv


5

ReactOS的项目-这是一个自由和开放源码实现的NT内核和相关的API -显然已经承诺也实现了自己的Interix样POSIX子系统(虽然MS原来的OS / 2子系统也是在上下文中提到,没有提及由ReactOS类似物制成)

尽管到目前为止的努力很小,但是fork()显然是现实。这是子系统项目页面的节选,如未解决的问题所示

路径

在POSIX应用程序中使用Win32路径的最佳方法是什么?想法:

  • 翻译//<device>/<path>成\\.\<device>\<path> (与驱动器字母的特殊情况- //<letter>/<path>=> <letter>:\<path>-和特别逃逸//./<raw text>=> \\.\<raw text>。UNC路径可以与指定//unc/<path>//标准保留路径用于实现特定的行为,并且//<letter>/在现有POSIX兼容环境中广泛使用了转义Win32路径的语法

  • 启发式识别“裸” Win32路径

  • Win32路径和//路径的大小写不敏感查找(标准是否允许这种特定于实现的//路径行为?)

我不确定这是否合格,因为我不确定已经实施了多少,但我认为这是对该问题的有用的有趣描述。


XENIX没有POSIX子系统,Windows有AFAIK。XENIX是Unix(最初基于Unix V7,微软从AT&T购买了许​​可证)。
斯特凡Chazelas

1
尼斯看这里还有约INTERIX / Windows的POSIX子系统
斯特凡Chazelas

@StéphaneChazelas-很好。我几乎要用它替换我的链接,但是最后它是基于意见的,实际上并不能作为参考...但是请不要删除评论?
mikeserv '16

无论如何,它都没有提及//foo/bar处理。到目前为止,我还没有找到有力的证据证明Windows POSIX子系统或Interix实际上已经处理了它们。
斯特凡Chazelas

@StéphaneChazelas-我不知道这是不是非常令人生厌,或者是否忽略了可选部分只是一个疏忽,但是MKS lsacl命令被要求理解,\\machinename\driveletter:\path而其registry命令被要求理解该形式或任意//一种方式。由于MKS套件是Interix的前身,并且是MS发行的1/2版的产品,所以我认为Interix必须接受这种基本内容的兼容语法。
mikeserv '16

4

在1980年代,SEL / Gould拥有一个名为UTX-32的Unix操作系统,该操作系统等效 于Solaris。即,主机上的远程访问路径。我找不到有关它的任何文档,所以我不知道这是RFS还是并行演进(或AT&T是否//host/path/net/host/pathpathhost偷了 从古尔德那里获得的)。


谢谢。您是否会偶然地//host/path在UTX-32中对此有任何参考?
斯特凡Chazelas

这可能是我在我的阁楼一箱硬拷贝文档,但不太可能- (1)我不记得曾经有很多文档(我记得有一个五分钟的口头简报); (2)即使我拥有它,也可能不会把它带回家;(3)即使我把它带回家,也可能在过去30年中把它扔了出去;(4)即使我仍然拥有它,我也可能找不到它。哦,也是(0)我花了五分钟在其上发布答案之前,对其进行了谷歌搜索(没有用)。
斯科特

4

我有一个模糊的记忆,该//host/path符号在AT&T SysV.3上用作其RFS远程文件共享实现的一部分。最终在SysV.4发行时就被放弃了,取而代之的是Sun Microsystems 的更简单但更流行的NFS

但是,我找不到对该语法的任何具体引用,而我刚才查看的文档似乎表明,用户明确指定远程主机名的想法将与位置独立性的设计原则背道而驰。

参考资料1. RFS体系结构概述


3
Founf 有关RFS。我找不到对的引用//host/path。似乎暗示必须明确安装网络文件系统。
斯特凡Chazelas

谢谢你提醒我。这是“我查看过的文档”的一部分,因此,如果您不介意,我会在其上添加一个链接。我仍然对此感到困惑;它可能会在第二天左右传给我。
roaima

4

POSIX在A.4.12路径名解析的基本原理第9和10段中指出:

在某些联网系统中,构造/../hostname/用于引用另一台主机的根目录,而POSIX.1允许这种行为。

其他联网系统出于相同目的使用//主机名构造;也就是说,使用了两个初始斜杠。

似乎可以确认它的//意思是“网络根”,或者至少是当规则包含在POSIX中时的想法。


遵循以下规则来删除///启动的路径名在路径中间的所有含义:

...因为两个或多个<slash>字符的非前导序列
被视为单个<slash>,...

当然,//启动的路径名可能会扩展或更改//路径名内部的使用(而不是在开始处)。POSIX.1允许这样做。最后一个确认唯一//允许的是路径名的开头。

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.