4

情况就是这样。我有一个目录调用:- %/home/myname/

我在该目录中做了一个软链接:- %cd /home/myname/ %ln -s /home/others/ 。

现在,我从 /home/myname/ cd 到 others/ 这里是有趣的部分。

当我执行 unix 内置pwd命令时,我得到了原始路径名:- %/home/others/

但是当我回显 $PWD 环境变量时,我得到了链接路径名:- %/home/myname/others/

为什么呢?

4

3 回答 3

2

/bin/pwd外部命令和内置命令之间的区别在于,外部命令不知道是哪组cd操作将您带到那里,因此不会假装您的当前目录位于符号链接链的某个位置;它为您提供从根目录到当前目录的直接路径,就像realpath()函数一样。

set -o physicalbash

于 2010-12-06T02:21:57.330 回答
2
/var# ls -l
lrwxrwxrwx 1 root root 10 Aug 22 13:21 邮件 -> 假脱机/邮件
drwxr-xr-x 2 root root 4096 Jul 1 20:58 opt
drwxr-xr-x 22 根根 4096 12 月 5 日 17:38 运行
drwxr-xr-x 12 根根 4096 8 月 22 日 13:21 线轴
drwxrwxrwt 14 根 4096 12 月 6 日 02:46 tmp
/var# cd 邮件
/var/mail# 回显 $PWD
/var/邮件

/var/mail#密码
/var/邮件

/var/mail# /bin/pwd
/var/spool/邮件

换句话说,使用$PWD就足够了,因为pwd无论如何可能不会给你更好的结果(对于任何更好的定义)。

为什么会这样?/bin/pwd使用特定于操作系统的调用来确定当前工作目录 - 在 Linux 的情况下,内核只保留已解析的目录(请参阅/proc/self/cwd参考资料),而 shell 的 pwds 包含 shell 认为它所在的目录。

于 2010-12-06T02:23:50.620 回答
0

/bin/pwd使用特定于操作系统的调用来确定当前工作目录。

你有一个 Git 2.34 (Q4 2021) 的说明,它必须替换$(pwd)$PWD,并解释了原因。

请参阅Johannes Sixt ( ) 的提交 f6a5af0(2021 年 8 月 24 日(由Junio C Hamano 合并 -- --提交 e18f4de中,2021 年 9 月 8 日)j6t
gitster

t9001:PATH不能使用 Windows 风格的路径

签字人:Johannes Sixt

在 Windows 上,$(pwd)返回驱动器号样式路径C:/foo,同时$PWD包含 POSIX 样式/c/foo路径。
当我们要对PATH变量中的当前目录进行插值时,一定不能使用该C:/foo样式,因为冒号的含义是模棱两可的。
使用 POSIX 样式。

于 2021-09-09T18:54:03.660 回答