28

假设我的主文件夹中有文件夹 ~/a/b,并且文件夹 b 包含一个名为 'symlink' 的符号链接到 '..'。然后我在 bash 中执行以下操作:

hm@mach:~$ cd a/b/symlink
hm@mach:~/a/b/symlink$ pwd -P
/home/hm/a
hm@mach:~/a/b/symlink$ cd ..
hm@mach:~/a/b$ pwd -P
/home/hm/a/b

pwd -P 打印当前工作目录,取消引用所有符号链接。为什么最后是工作目录/home/hm/a/b,而不是/home/hm?

4

2 回答 2

30

help cd

  Options:
      -L        force symbolic links to be followed: resolve symbolic
                links in DIR after processing instances of `..'
      -P        use the physical directory structure without following
                symbolic links: resolve symbolic links in DIR before
                processing instances of `..'

换句话说,-L意味着使用逻辑结构,而-P使用实际的物理目录结构。

逻辑结构是这样的,

$ tree a
a
└── b
    └── symlink -> ..

当你去的时候,实际的物理结构a/b/symlink是,

a

如果你想使用真实的 ..,那么你还必须使用cd -P

          The -P option says to use the physical directory
          structure instead of following symbolic links (see
          also the -P option to the set builtin command);
          the -L option forces symbolic links to be followed.

一个例子,

$ cd
$ cd a/b/symlink   # physical location is at a/
$ cd ..            # now is at a/b
$ cd symlink       # goes back to a/b/symlink
$ cd -P ..         # follow physical path (resolve all symlinks)
$ pwd -P           # -P is optional here to show effect of cd ..
/home/sarnold
$ 
于 2012-05-04T22:22:15.930 回答
5

bash跟踪逻辑当前目录路径,如提示中所示,并cd ..据此解释类似的内容。cd如果您仅在(or )中使用此类路径,这会使事情更加一致,但如果您希望在命令参数(或内部命令)中的路径发生同样的事情;并且有自己的可配置规则pushd,则以发生意外事情为代价用于符号链接处理,但大多数命令依赖内核来处理它)。emacsvim

于 2012-05-04T22:20:50.320 回答