前提
我已阅读了参考书目中列出的有关cd
、、的内容pwd
。set -P
默认情况下,或者当
-L
提供选项时,目录cd
中的符号链接将在处理目录中的“ ”实例后解析..
。(参考 Bash 参考手册 - 第“ 4 Shell 内置命令” -cd
段落)
如果 '
..
' 出现在目录中,则通过删除紧接在前的路径名部分,返回到斜杠或目录的开头来处理。(同上)
我的 Bash 版本是
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
问题
为了测试一下,我在当前工作目录中有以下文件方案,它是我实验的根目录(dir111
是指向的符号链接dir010
)。
dir010/
dir020/
dir110/dir111 -> ../dir010
my_dir="$PWD"
cd dir110/dir111 # 1
cd .. # 2
cd dir111 # 3
cd ../dir020 # 4
cd "$my_dir" # 5
cd dir110/dir111/../dir020 # 6
cd - # 7
cd dir110/dir111/../../dir020 # 8
- 将当前工作目录设置为
"$my_dir"/dir110/dir111
,如预期的那样[^1]。 - 将当前工作目录设置为
"$my_dir"/dir110
,如预期的那样[^1]。 - 返回 1。
- 将当前工作目录设置为
"$my_dir"/dir020
,意外的。我预计cd
会失败"$my_dir"/dir110/dir020
(请参阅下面的解释)。 - 回到我的实验的根源。
- 与 4 相同。
- 回到我的实验的根源。
- 将当前工作目录设置为
"$my_dir"/dir020
,符合预期[^1],但与 6 相反。
第 4 行应该会因下一段中的原因而失败。
参考手册和手册页(参见前提中的引文)都指出..
makecd
仅删除前面的路径名组件,而不查看..
inode 条目的。因此(在默认行为中)"$my_dir/dir110/dir111
看到的父目录是,其中不包含。cd
"$my_dir/dir110
dir020
我认为此行为可能是由于作为提供给..
的前缀而导致的异常。但是,使用作为中缀(第 6 行)与此形成对比。«dirname»
cd «dirname»
..
cd
表现得好像cd -P
已经执行过(或set -P
(或类似)之前发出的命令),即不遵循符号链接。使用cd -P
,在 1. 处,当前工作目录将设置为$my_dir/dir010
。
set -o
告诉我
[omissis]
physical off
pipefail off
posix off
[omissis]
cd
我(以及其他发布的问题中和我一样的人)对参考手册的解释是否正确?我遗漏了什么?如何描述行为?
[^1]: 的默认行为cd
是跟随符号链接
参考书目
- Bash 手册页第“SHELL 内建命令”
- Bash 参考手册第 4 节“Shell 内置命令”
- 使用符号链接更改父目录(../)
- 根据 pwd (符号链接目录) 进行路径解析
- 如何在 bash 中使用符号链接向上和向下执行 cd?
源代码指出这是一个特殊情况,
cd
如果逻辑目录不起作用,bash 将重试:dir110
为了测试这一点,我在called中创建了另一个目录dir120
,然后运行strace
以查看chdir(2)
调用:您可以看到给定路径形式的差异
chdir()
。当然,正如评论所说,在 POSIX 模式下行为是不同的: