情况就是这样。我有一个目录调用:- %/home/myname/
我在该目录中做了一个软链接:- %cd /home/myname/ %ln -s /home/others/ 。
现在,我从 /home/myname/ cd 到 others/ 这里是有趣的部分。
当我执行 unix 内置pwd
命令时,我得到了原始路径名:- %/home/others/
但是当我回显 $PWD 环境变量时,我得到了链接路径名:- %/home/myname/others/
为什么呢?
/bin/pwd
外部命令和内置命令之间的区别在于,外部命令不知道是哪组cd
操作将您带到那里,因此不会假装您的当前目录位于符号链接链的某个位置;它为您提供从根目录到当前目录的直接路径,就像realpath()
函数一样。
见set -o physical
中bash
。
/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 认为它所在的目录。
/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 样式。