it-swarm.cn

Linux如何处理多个连续的路径分隔符(/ home ///// username //// file)?

我正在研究python脚本,该脚本将文件位置传递给scp子进程。这一切都很好,但是我可能会最终将路径与文件名连接起来,有一个双'/在路径中。我知道bash不在乎您是否有多个文件分隔符,但是我想知道如何正确地对其进行纠正。是bash去除多余的/s还是真的没关系吗?

我问,因为这将节省我几行代码来检查多余的/s在连接时。我知道这没什么大不了的,但我也很好奇。我有一个bash脚本,其行是cd //usr (代替 cd /usr),这似乎意味着使用多个/s在路径中

117
Falmarri

允许使用多个斜杠,并且等效于单个斜杠。从 单个Unix规范(版本4)基本定义§3.271路径名 :“多个连续的斜杠被认为与一个斜杠相同。”

有一个例外:如果路径名以两个连续的字符开头,则可以以实现定义的方式解释开头字符之后的第一个组件。 (参考: 基本定义§4.13路径名解析 )。 Linux本身不这样做,尽管某些应用程序可能会这样做,而其他unix-ish系统也会这样做(例如Cygwin)。

路径名末尾的/会强制该路径名引用目录。在( POSIX 1003.1-2001(Single Unix v4)基本定义§4.11路径名解析 中,尾随/等效于尾随/.POSIX 1003.1- 2008(Single Unix v4)基本定义§4.1 删除了使其与/.等效的要求,以便处理不存在的目录(例如,必须使用mkdir foo/,而mkdir foo/.不会-参见 rationale 了解更改)。

对于作用于目录条目的程序,如果foo是指向目录的符号链接,则传递foo/是使程序作用于目录而不是符号链接的一种方式。

¹ 请注意,这仅适用于路径名解析,即在访问文件时。文件名操作可能会有所不同。例如 basenamedirname 忽略尾部斜杠。

173

操作系统似乎也不关心它,只是尝试了使用直接syscall在路径中以//打开的C程序。

您可以使用python)库函数os.path.normpath对其进行规范化,这省去了扫描字符串以寻找额外内容的麻烦。其他语言也具有类似的功能。

http://docs.python.org/library/os.path.html#os.path.normpath

17
Ivatar

在我看到的所有Unix系统上,它都与单个/,但 nix标准 指定

可以以实现定义的方式解释以两个连续的斜杠开头的路径名,尽管应将两个以上的前导斜杠视为一个斜杠。

因此可能会根据您的系统进行特殊处理。 (某些较早的Unix版本使用双引号/进行远程文件系统访问,并且仍然可以执行某些操作。)

9
Fred Foo

在Python中使用 os.path.join ,不会有多个斜线。通过连接字符串自己建立文件名被认为是Python风格不佳。

7
Neil Mayhew

没有区别。

多个斜杠将被忽略(不起作用),例如:

ls -al //usr///////bin/sed
3
ChristopheD

当然,您可以通过将路径传递给tr -s来规范路径中可能包含多个/(斜杠)的路径

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

...然后使用$NORMALIZED

但是,这是必要的。据我所知,任何适当的UNIX内核都应该忽略并发路径分隔符---或从概念上将它们视为..././...

0
Jim Dennis