当我通过符号链接 cd 时,为什么 pwd 显示符号链接而不是真实路径?

DSc*_*ipt 19 shell cd-command symlink

我创建了一个指向ln -s 1 2目录内的test目录的软链接 ( cd 2),并打开了软链接 ( ) 并使用pwd. 显示的路径是~/test/2和 不是~/test/1。

它在像 Windows 这样的操作系统中是不同的,快捷方式将我们带到真正的目录。我有点困惑这个软链接在 Linux 中是如何工作的。它不是像 in 那样的快捷方式Windows吗?为什么路径不是~/test/1?

 $ mkdir test
 $ cd test
 $ mkdir 1
 $ ln -s 1 2
 $ cd 2
 $ pwd
 /home/dazz/test/2
Run Code Online (Sandbox Code Playgroud)

Ant*_*hon 19

这是 shell 的一个功能,它可以记住您是如何到达当前位置的。
如果您已经realpath安装,您可以执行以下操作:

$ realpath 
/home/dazz/test/1
Run Code Online (Sandbox Code Playgroud)

如果你有 python,那就没有了:

$ python -c "import os; print(os.path.realpath('.'))"
/home/dazz/test/1
Run Code Online (Sandbox Code Playgroud)

或 readlink(来自 coreutils):

$ readlink -f .
/home/dazz/test/1
Run Code Online (Sandbox Code Playgroud)

或/bin/pwd(不是内置的外壳pwd):

$ /bin/pwd
/home/dazz/test/1
Run Code Online (Sandbox Code Playgroud)

  • 还要注意 `pwd -P` 打印当前目录的物理路径,而不是逻辑路径。 (9认同)

roa*_*ima 8

对比pwd和/bin/pwd。

pwd,这是许多 shell 中的内置命令,它告诉您 shell 认为您在哪里(因此将符号链接视为“软链接”,就好像它们是真正的目录一样。

/bin/pwd是一个外部程序,它告诉你你的真实位置,如有必要,通过遍历文件系统树直到/. 它不考虑符号链接,因为它们在向上遍历时不存在..


Dav*_*ord 6

其他答案涵盖了/bin/pwd与 shell 的builtin pwd.

如果您想遵循您提到的 Windows 样式中的符号链接,请使用cd -P: 它将相应地更改 PWD 变量。

如果要-P默认使用,可以将此行添加到您的.bashrc或.zshrc:

set -P
Run Code Online (Sandbox Code Playgroud)

其他外壳可能会有所不同。