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


13

当我想通过键入返回Linux的上级目录时cd ..,我会输入错误cd //。令我惊讶的是,没有错误报告。更重要的是,提示变为username@hostname://$ls表示我现在在根目录下。

这是Shell的错误还是功能?如果是功能,是//的别名/吗?我的外壳是GNU bash,版本4.1.5(1)-发行版(i686-linux-gnu)。

谢谢和最好的问候。


Answers:


30

也可以考虑。

在Linux中,//没有任何意义–多个连续的斜杠在路径中的任何位置(包括开头)折叠为一个。更改目录以//将您置于/,如运行所示readlink /proc/self/cwd。同样地,/usr//local///bin折叠为/usr/local/bin

但是,某些其他类似Unix的系统(例如Cygwin或旧的Apollo Domain / OS)使用// 前缀用于网络路径,例如//fileserver/path/to/data。POSIX也允许这样做。

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


有趣的是,zsh允许cd //,但足够聪明,只显示/提示字符串即可。
new123456'4

@BinaryZebra Bitsavers有一些旧的Unix手册,包括Apollo的手册-这里应该有很多例子。TUHS网站也应该有一些东西。
user1686 '16

非常感谢,我在Bitsavers手册中找到了//的描述。

9

从POSIX路径名定义中:

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

资源

更准确地说,正如他在下面的注释中提到的,从关于路径名解析的4.11章中

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


1
更合适的部分是4.11路径名解析(最后一段),因为所讨论的行为仅出现在两个斜杠之间。
user1686

3

这是一种功能。如果您可以使用Shell脚本find,例如,通常所有路径都以./作为前缀。然后,如果将其添加到实际路径,它将变成`/my/path/./appended/path,解析为/ my / path / appended / path。因此,如果我没记错的话,// get解释为/./,因此也解释为/。这与如果您转到/ home / user //时会出现在/ home / user /


1

我会去提示显示“错误”。

路径“ /”,“ //”,“ /////////////////////”,...具有相同的含义:“ /”。您可以在Unix路径中的任意位置添加任意数量的“ /”,但这不会改变其含义。

“错误”在这里更多与以下事实有关:提示使用显示路径中最后键入的有效字符,而不是实际的“ pwd”。

无论如何有趣;)


同意- //提示中的提示是提示环境变量($PS1)的副作用-如何PS1定义?
道格·哈里斯

@DougHarris $PS1变量定义为[\u@\h \W]\$。设定有问题吗?
Summer_More_More_Tea '02

奇。如果尝试使用PS1,则/当pwd =时只能得到一个/。我想知道您是否正在做任何额外的工作来获取目录。被$PROMPT_COMMAND设置?
道格·哈里斯

@DougHarris是,已设置此变量,其值为echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007"。您能否详细解释一下?我对这两个变量不太熟悉。谢谢。
Summer_More_More_Tea

阅读bash手册页并搜索PS1PROMPT_COMMAND- man bash在您的命令行上使用或在线阅读
Doug Harris

1

其功能和所有多个//将被替换为一个/

如果您的变量末尾带有类似示例的路径,则它很有用。因此,您的CD将不会出现任何错误,并且您不必更改工作区变量。

MY_WORKSPACE = /家庭/您的用户名/工作区/
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

项目变量的完整内容是

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.