Linux 中路径 `//` 代表哪个目录?

Linux 中路径 `//` 代表哪个目录?

在 Linux 中,我想输入 回到上一级目录cd ..,结果输入了cd //。出乎意料的是,并没有报错。而且提示符变成了username@hostname://$ls这说明我已经在根目录了。

这是 shell 的一个错误还是功能?如果是功能,则是//的别名/吗?我的 shell 是 GNU bash,版本 4.1.5(1)-release (i686-linux-gnu)。

谢谢,并致以最诚挚的问候。

答案1

都可以考虑。

在 Linux 中,//没有任何意义 - 多个连续的斜线会被折叠成一个,任何地方在路径中,包括开头。将目录更改为 会将//您带入/,正如运行readlink /proc/self/cwd所提示的那样;同样,/usr//local///bin会折叠为/usr/local/bin

然而,其他一些类 Unix 系统,例如 Cygwin 或旧的 Apollo Domain/OS,使用// 字首对于网络路径,例如//fileserver/path/to/data。POSIX 也允许这样做。

由于各种原因,狂欢shell 会自行跟踪当前目录(除了操作系统提供的跟踪之外),并且它有代码可以防止初始项//被折叠,以保持与此类系统的兼容性。“功能”是狂欢提供更直观的当前目录跟踪,例如,当cd进入符号链接时,狂欢会显示你期望的路径,即使内核认为不是这样。“错误”在于狂欢//即使在不使用它的系统上也允许。

答案2

来自 POSIX 路径名定义:

路径名可以选择性地包含一个或多个尾部斜杠。多个连续的斜杠被视为与一个斜杠相同。

来源

更准确地说,正如 Gravity 在下面的评论中提到的那样,从4.11章关于路径名解析:

以两个连续斜杠开头的路径名可以按照实现定义的方式进行解释,但两个以上的前导斜杠应被视为单个斜杠。

答案3

这是一种功能。find例如,如果您运行 shell 脚本并使用 ,则所有路径通常都以 ./ 为前缀。然后,如果您将其添加到实际路径上,它将变为 `/my/path/./appended/path,解析为 /my/path/appended/path。因此,如果我没有记错的话,// 会被解释为 /./,因此 /。如果您转到 /home/user//,您将最终进入 /home/user/,情况也是如此

答案4

它是一个功能,所有多个//将被替换为一个/

如果您有带路径的变量(如末尾的示例),它将非常有用。这样您的 cd 就不会出现任何错误,您也不必更改工作区变量。

MY_WORKSPACE=/home/你的用户名/工作区/
我的新项目=$我的工作空间/我的项目/
cd $我的新项目

项目变量的完整内容是

/home/你的用户名/工作区//my_proj/

相关内容