为什么 bash 可以 cd 到 //?

为什么 bash 可以 cd 到 //?

在 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 在告诉系统更改目录之前会进行路径规范化

相关内容