在整个POSIX规范中,都提供了(1、2、3 ...)来允许实现专门处理以两个/开头的路径。

POSIX应用程序(一种写入POSIX规范的应用程序可移植到所有符合POSIX的系统)不能假设//foo/bar/foo/bar相同(尽管他们可以假设///foo/bar/foo/bar相同)。

现在有哪些POSIX系统(历史悠久且仍在维护中) )特别对待//foo?我认为(现已证明我错了),Microsoft已将POSIX设置推向其Unix变体(XENIX),并可能是Windows POSIX层(有人可以确认吗?)。

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

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

某些运行在类Unix之类的应用程序上(如果不是系统的API的话)是否将//foo/bar路径特别对待(在将/foo/bar视为文件系统路径的情况下)?


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

评论

相关:官方描述UNC(通用命名约定)

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

正如您提到的,标准(pubs.opengroup.org/onlinepubs/009695399/basedefs/…)表示,“以两个连续的斜杠开头的路径名可能会以实现定义的方式进行解释”(超过2个解析为1 /) 。网上有一个例子:austingroupbugs.net/view.php?id=83(IBM的z / OS将//路径名请求解析为MVS数据集(与分层文件系统(HFS)相对)(......)此外,z / OS不会接受或识别附加到此类路径的其他“目录”或“文件”组件.... ^^)并不完全是unix。

@DevSolar:确实很有趣(而且令人惊讶),但是我们应该只使用POSIX,因为在POSIX中,任何事情都是可能的^^

@edwardtorvalds,因为第一位是URL:file://,类似于http://等。在chrome上的工作环境中,我现在打开的Windows UNC路径为file:////$$MACHINE/$SHARENAME/index.html(尽管由于某些原因它也可以理解file:// $ MACHINE / ...)

#1 楼

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


Cygwin。用于Microsoft Windows的POSIX层。自Windows 1.3起用于Windows UNC路径。

UWIN。 Windows的另一个POSIX层。至少用于//host/file网络文件共享路径。如POSIX错误跟踪程序中所述,@@ OlivierDulacIBM z / OS,z / OS将//pathname请求解析为MVS数据集,而不是网络文件。示例。

终止系统


@BinaryZebraApollo域/ OS(已确认)。在正式说明UNC(通用命名约定)中也提到了//host/path表示法的可能来源(另请参见第2-15页)。
根据Donn Terry的说法,是HP(收购了Apollo Computers)推动加入

@ jillagreTektronix Utek(已确认),其中//host/path是分布式文件系统上的路径。


@具有GillesQNX 4的FLEET分布式处理系统,其中//123/path是节点123上的/path。(在QNX 6文档中已提及。)


@ roaimaAT&T SysV版本3(未验证)。 //host/path in(在SVR4中已终止)RFS远程文件共享系统。


@ ScottSEL / Gould UTX-32(未验证)。用于//host/path


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


@PremPerforce,其中//depot/A/B/C/D表示仓库中的路径。 >
@WCharginBlender。在其配置中,您使用//前缀作为相对路径(到与数据块关联的混合路径)。


评论


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

–Jörg W Mittag
16 Jan 21'在2:20



Windows本身实现POSIX API ...如何处理前导双斜杠?

–凯文
16年1月24日,1:13

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

– Alex Gittemeier
16年1月24日,下午2:13

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

–StéphaneChazelas
16年1月24日在9:34

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

–StéphaneChazelas
16 Jan 24'9:35



#2 楼


是否某些运行在类Unix之类的应用程序上(如果不是系统的API)特别对待// foo / bar路径?


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

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

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

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

#3 楼

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

,我还没有引用它作为支持,但是最终我可能会在我的地窖中找到一些Utek文档并更新此答复。

评论


此Usenet讨论证实了这一点

–StéphaneChazelas
16年1月22日在16:41

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

–user79743
16年1月23日在12:59

从将其发布到BSD的公共领域RFS实现的作者(在Tektronix工作)开始,那里既开发了DFS,也开发了RFS。

–StéphaneChazelas
16年1月25日在15:47

泰克/ BSD RFS实现显然将远程文件系统安装在常规文件上,以避免例如遍历安装点。作者在此处明确排除了// foo / bar(或纽卡斯尔连接的/../foo/bar)

–StéphaneChazelas
16 Jan 25 '15:54



确认DFS的其他Usenet线程

–StéphaneChazelas
16年1月25日在16:00

#4 楼

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


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


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


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

因此,我们确认Apollo的Domain / OS使用//作为网络根。

评论


我认为这位有才华的家伙是主要的Arch Linux开发人员。

–mikeserv
16年1月20日在14:14

#5 楼

另一个应用程序:Blender将前导//视为对项目目录(保存.blend文件的目录)的引用。这是相关的手册页。

对于非类Unix操作系统(即Windows)也是如此。

#6 楼

ReactOS项目是NT内核和相关API的免费开放源代码实现,显然已经承诺也将实现其自己的类似Interix的POSIX子系统(尽管在上下文中也提到了MS的原始OS / 2子系统,没有提及)由ReactOS的类似物组成。)

尽管到目前为止所做的努力很小,但fork()显然是现实。这是子系统项目页面的摘录,在未解决的问题中列出:


路径


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


//<device>/<path>转换为\.\<device>\<path>(具有特殊的驱动器字母-//<letter>/<path> => <letter>:\<path>-和特殊的转义//./<raw text> => \.\<raw text>。可以使用//unc/<path>指定UNC路径) 。标准为实现特定行为保留了//路径,而逃逸Win32路径的//<letter>/语法已在现有POSIX兼容环境中广泛使用。
启发式算法可识别“裸露”的Win32路径,从而使它们不区分大小写。查找Win32路径和//路径(标准是否允许//路径具有这种特定于实现的行为?)。





我不确定该如何实现,因为我不确定已经实现了多少,但我认为这是一个有用的有趣的描述问题的原因。

评论


XENIX没有POSIX子系统,Windows有AFAIK。 XENIX是Unix(最初基于Microsoft从AT&T购买的Unix V7)。

–StéphaneChazelas
16年1月26日在10:32

在这里也可以很好地阅读有关Interix / Windows POSIX子系统的信息

–StéphaneChazelas
16 Jan 26'在10:39



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

–mikeserv
16 Jan 26'在10:50



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

–StéphaneChazelas
16年1月26日在11:25

@StéphaneChazelas-我不知道它是否极度令人生厌,或者是否忽略了可选部分只是一个疏忽,但是MKS lsacl命令被指定为理解\\ machinename \ driveletter:\ path,而其注册表命令为spec' d了解该形式,或者(可选)//了解任一种方式。由于MKS套件是Interix的前身,并且是MS发行的1/2版的产品,所以我认为Interix必须已经接受了此类基本语法的兼容语法。

–mikeserv
16年1月26日在11:45

#7 楼

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

评论


谢谢。您是否会碰巧对此有任何参考(UTX-32中的// host / path)?

–StéphaneChazelas
16年1月22日在9:16

我可能在阁楼的盒子里放了一份纸质文件,但不太可能-(1)我不记得有很多文件(我记得有五分钟的口头通报); (2)即使我有它,也可能没有带回家; (3)即使我把它带回家,也可能在过去的30年中把它扔了出去; (4)即使我仍然拥有它,我也可能找不到它。哦,也是(0),我在张贴答案之前花了五分钟(无济于事)使用Google谷歌搜索功能。

–斯科特
16年1月22日在9:48

#8 楼

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

但是,我找不到任何具体的语法参考,以及我所拥有的文档刚刚进行的回顾似乎表明,用户明确指定远程主机名的想法将与位置独立性的设计原则相抵触。

参考文献
1。 RFS体系结构概述

评论


关于RFS的知识。我找不到对// host / path的引用。似乎暗示必须显式安装网络文件系统。

–StéphaneChazelas
16年1月20日在21:01

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

–roaima
16年1月20日在21:07

#9 楼

POSIX在A.4.12路径名解析的原理中声明第9和10段:在某些联网的系统中,构造/../hostname/用于引用另一个系统的根目录。主机,而POSIX.1允许这种行为。

其他联网系统出于相同目的使用//主机名构造;



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


遵循规则删除//起始路径的中间部分的/的任何含义路径名:


...由于非-两个或多个字符的前导序列
被视为单个,... ...



当然,以//开头的路径名可能会扩展或更改在路径名(不在开头)中使用//。 POSIX.1允许这样做。
这最后一个确认了所允许的唯一//位于路径名的开头。