![为什么 bash 可以 cd 到 //?](https://linux22.com/image/1242333/%E4%B8%BA%E4%BB%80%E4%B9%88%20bash%20%E5%8F%AF%E4%BB%A5%20cd%20%E5%88%B0%20%2F%2F%3F.png)
在 bash 中,如果您 cd 到 //,您的密码将是 //,但如果您 cd 到 / 或 ///+,您的密码将是 /。这有什么原因吗?还是只是一个奇怪的错误?
我已经在 osx 和 ubuntu 中尝试过这个。
答案1
来自Bash 常见问题解答:
E10)为什么“cd //”将 $PWD 保留为“//”?
POSIX.2 在“cd”的描述中说三在规范化当前工作目录时,可以将多个前导斜杠替换为单个斜杠。
我推测这是为了历史兼容性。某些版本的 Unix 和早期的网络文件系统使用 //hostname/path 形式的路径来访问服务器“hostname”上的“path”。
答案2
虽然根据给出的数据,答案是正确的,但它并没有完全回答所提出的问题。
shell 正在规范化路径。它执行以下操作:
- 将任何 part1/part2/.. 组件更改为 part1/
- 将所有 //+ 组件更改为 /
你可以用 strace 来验证这一点,它会看到实际传递到系统调用中的内容
strace -o /tmp/strace.out bash -c "cd ///tmp"
grep chdir /tmp/strace.out
# will give chdir("/tmp")
strace -o /tmp/strace.out bash -c "cd ///tmp/../etc"
grep chdir /tmp/strace.out
# will give chdir("/etc")
shell 在告诉系统更改目录之前会进行路径规范化