Bash 的“cd”与符号链接的行为不一致

Bash 的“cd”与符号链接的行为不一致

我目前正在尝试了解 Bashcd在符号链接方面的行为。默认情况下,cd应遵循逻辑目录结构并且不应解析符号链接。

cd在我的第一个示例中,行为类似。然而,我想出了第二个例子,它cd似乎遵循物理结构。这是预期的行为吗?有什么不同?

设置

$ cd
$ mkdir -p test/a/b/c test/d
$ tree test
test
├── a
│   └── b
│       └── c
└── d

4 directories, 0 files
$ cd test/d
$ ln -s ../a/b/c symlink

第一个例子

$ pwd
/home/hexcabron/test/d
$ tree ..
..
├── a
│   └── b
│       └── c
└── d
    └── symlink -> ../a/b/c

5 directories, 0 files
$ cd symlink/../../a
$ pwd
/home/hexcabron/test/a

第二个例子

$ cd ../d
$ pwd
/home/hexcabron/test/d
$ mkdir -p symlink/../e
$ tree ..
..
├── a
│   └── b
│       ├── c
│       └── e
└── d
    └── symlink -> ../a/b/c

6 directories, 0 files
$ cd symlink/../e
$ pwd
/home/hexcabron/test/a/b/e

答案1

好问题。假设您使用的是 bash,cd将默认使用以下符号链接。可以使用-P-L标志来覆盖此行为,cd分别强制使用物理路径和链接路径。

我假设在您的第一个示例中,cd注意到符号链接后面没有目录路径a,因此它尝试了物理路径并找到了该目录。我很难找到证据来支持这个假设,但你可以遵循以下逻辑:来源确切地了解发生了什么(代码不多)。

相关内容