为什么 ls // 在 Cygwin 中挂起

为什么 ls // 在 Cygwin 中挂起

当我在 Cygwin 中运行该命令时ls //,shell 会挂起大约 12 秒,然后出现错误ls: reading directory '//': Permission denied。我记得在某处读到过它的/some//path解释与 POSIX 路径中的解释相同/some/path,因此,当我在 Ubuntu 虚拟机中运行该命令时,没有任何延迟,并且 ls 会输出 的内容/

我在 Cygwin 特殊文件名文档中找不到任何相关信息//,那么为什么会发生这种情况,我该如何减少延迟?

编辑:

事实证明,\\*路径是 Windows 上的网络路径。当我断开计算机与所有网络的连接时,ls \\立即返回一个空列表。当我连接到某些网络时,我会获得网络上的主机列表,但在其他网络上,我遇到了上述问题。考虑到这一点,是否有某种方法可以配置 Windows,以便在出现权限错误的情况下减少延迟?

答案1

这不是 Cygwin 的问题,而是 Unix 的问题。在计算机网络发展的早期,在 Sun(Solaris)引入访问远程文件系统的语法1之前,NFS 允许将远程文件系统挂载到任意挂载点(例如或),某些版本的 Unix 实现了一种用于相同目的的语法。请参阅/net/hostname/mnt/home/username//hostname/pathname在哪些系统上有所//foo/bar不同/foo/bar  多年来,该语法已不再受欢迎,并(大部分?)让位于 NFS。

然而,为了让这些遗留系统符合 POSIX 标准, 标准明确允许//表示不同于/ (在开始路径)

如果路径名以两个连续的 <slash> 字符开头,则前导 <slash> 字符后面的第一个组件可以按照实现定义的方式进行解释,但两个以上的前导 <slash> 字符应被视为单个 <slash> 字符。
        (来自“路径名解析”部分的结尾附近)

— 尽管它没有具体说明其含义(如果有的话)。

Cygwin 解释//和旧的差不多/net如此处所述。它引用了 Windows 的“网络”(伪)文件夹——包含“这台计算机”和其他可发现的机器。

也可以看看Unix:以 和 开头的路径之间的/区别//.
____________
1 … 并且/net可以选择列出以生成具有导出文件系统的可访问主机的名称列表 - 即文件服务器。

答案2

https://cygwin.com/cygwin-ug-net/using.html#unc-paths

还有一个虚拟目录//允许使用 ls 枚举本地机器已知的文件服务器。

答案3

在我的计算机上,ls //也运行缓慢,打印几个cannot access '//some-computer-name': No such file or directory,最后打印几个计算机名称。这些是本地网络上的 Windows PC,显然ls试图连接到它们(不知道为什么)。

另一方面,dir \\运行快速并打印相同的计算机名称(没有错误消息)。

我认为没有办法配置 Windows 来防止这种情况发生,在我看来这是一个 Cygwin 问题(或特征)。最好的办法是向 Cygwin 的邮件列表写信,请求修复它。

无论如何,我可以问一下你为什么要跑步ls //吗?

相关内容