![Linux如何处理多个连续的路径分隔符(/home////用户名///文件)?](https://linux22.com/image/41698/Linux%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%A4%9A%E4%B8%AA%E8%BF%9E%E7%BB%AD%E7%9A%84%E8%B7%AF%E5%BE%84%E5%88%86%E9%9A%94%E7%AC%A6%EF%BC%88%2Fhome%2F%2F%2F%2F%E7%94%A8%E6%88%B7%E5%90%8D%2F%2F%2F%E6%96%87%E4%BB%B6%EF%BC%89%EF%BC%9F.png)
我正在编写一个将文件位置传递给 scp 子进程的 python 脚本。一切都很好,但我所处的情况可能最终将路径与文件名连接起来,使得/
路径中有一个双 ' 。我知道 bash 并不关心是否有多个文件分隔符,但我想知道这是如何纠正的。是 bash 删除了多余的/
s 还是真的不重要?
我问这个问题是因为它会节省我在连接时检查额外的代码行/
。我知道这没什么大不了的,但我也很好奇。我有一个 bash 脚本,其中包含该行cd //usr
(而不是),这似乎意味着在路径中cd /usr
使用多个 s 可能很重要/
答案1
允许使用多个斜杠,并且等同于单个斜杠。来自单一 Unix 规范(版本 4),基本定义§3.271 路径名:“多个连续的斜杠被认为与一个斜杠相同。”
有一个例外:如果路径名以两个连续的斜杠字符开头,则前导斜杠字符后面的第一个组件可能会以实现定义的方式进行解释。 (参考:基本定义§4.13 路径名解析)。 Linux 本身不这样做,尽管某些应用程序可能会这样做,而其他 UNIX 系统(例如 Cygwin)会这样做。
路径名末尾的尾随/
强制路径名引用目录。在 (POSIX 1003.1-2001 (Single Unix v4) 基本定义 §4.11 路径名解析,尾随/
相当于尾随/.
。POSIX 1003.1-2008(Single Unix v4)基本定义§4.13删除了使其等同于/.
, 的要求,以应对不存在的目录(例如,mkdir foo/
需要工作,而mkdir foo/.
不会 - 请参阅理由用于更改)。
对于作用于目录项的程序,如果foo
是指向目录的符号链接,则传递foo/
是使程序作用于目录而不是符号链接的一种方法。
1请注意,这仅适用于路径名解析,即访问文件时。文件名操作可能会有所不同。例如basename
和dirname
忽略尾部斜杠。
答案2
操作系统似乎也不关心它,刚刚尝试了一个带有直接系统调用的 C 程序,以在路径中使用 // 打开。
不过,您可以使用 python 库函数 os.path.normpath 对其进行规范化,这样您就不必扫描字符串来查找额外内容。其他语言也有类似的功能。
http://docs.python.org/library/os.path.html#os.path.normpath
答案3
在我见过的所有 Unix 系统上,它与 single 相同/
,但是Unix标准指定
以两个连续斜杠开头的路径名可以以实现定义的方式解释,尽管两个以上的前导斜杠应被视为单个斜杠。
因此,根据您的系统,可能会对其进行特殊处理。 (一些较旧的 Unix 版本使用双前导/
进行远程文件系统访问,并且可能仍然有一些这样做。)
答案4
没有区别。
多个斜杠被忽略(没有效果),例如:
ls -al //usr///////bin/sed