![为什么 ls // 在 Cygwin 中挂起](https://linux22.com/image/1487611/%E4%B8%BA%E4%BB%80%E4%B9%88%20ls%20%2F%2F%20%E5%9C%A8%20Cygwin%20%E4%B8%AD%E6%8C%82%E8%B5%B7.png)
当我在 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 //
吗?