主要是因为pwd
不是内置的,而.
内置于 bash shell 吗?
例如,它们在以下示例中有所不同:
/tmp/ttt$ mv ../ttt ../tttt
/tmp/ttt$ pwd
/tmp/ttt
/tmp/ttt$ cd .
/tmp/tttt$
答案1
.
不是 bash(或任何其他 shell)内置的。每个目录都有条目.
和..
。您可以通过 cd'ing 到某个任意目录并执行 来进行验证ls -lia
。您将看到.
和..
条目。我让你使用 '-i' 标志来ls
获取 inode 编号:记下它们的.
和..
。向上一个目录,但执行cd ..
or cd /something/soemthingelse/whatever
。再做ls -lia
一次。请注意, 的索引节点号与第一个列表中的索引节点.
号相同。..
每个目录在创建时都有目录,名为“.”和 ”..”。这 ”。”条目的索引节点号与其父目录中的目录名称相同。 “..”条目始终是父目录。如果你这样做,ls -li /
你会看到那个“。”和“..”具有相同的值。
此约定消除了特殊情况代码引用当前目录的需要:它始终命名为“.”。它消除了特殊情况代码“转到一个目录”的需要:它始终是“..”。唯一的特殊情况是根目录和网络安装的文件系统。文件系统根目录有“.”和“..”具有相同的inode编号,没有不同。网络挂载的文件系统在挂载点处的 inode 编号不连续,其行为取决于远程文件系统是什么以及用于挂载它的协议。
至于提示符的更改,当您调用 时mv ../ttt ../tttt
,您实际上重命名了 shell 的工作目录。在您执行此操作之前,您没有调用检查工作目录的 shell 命令cd .
,因此中间pwd
会报告旧名称/tmp/tt
.
答案2
假设你使用的是 Bash,它有pwd
作为内置1,发生的情况是该cd
命令触发 shell 更新有关当前目录的信息。在您运行之前cd
,shell 会认为当前目录没有更改,因此它不会尝试获取新路径。
顺便说一下,稍微扩展一下 Gnouc 的内容回答,开放组基本规范第 6 期环境变量说:
PWD
[...] 应表示当前工作目录的绝对路径名。它不应包含任何点或点-点的文件名组件。该值由以下设置cd
公用事业。
另一方面,如果您运行外部/bin/pwd
命令,您将获得当前目录的新名称。为什么会出现这种情况?这pwd
命令来自核心工具对环境变量进行一些健全性检查PWD
,如果它无效则不会打印它。详细内容可以在源码中找到logical_getcwd
函数(来自 coreutils 版本 8.23)。
您可以用来获取当前目录的规范路径的另一个命令是readlink -f .
2。
[ciupicri@host ttt]$ pwd
/tmp/ttt
[ciupicri@host ttt]$ mv ../ttt ../tttt
[ciupicri@host ttt]$ pwd
/tmp/ttt
[ciupicri@host ttt]$ /bin/pwd
/tmp/tttt
[ciupicri@host ttt]$ readlink -f .
/tmp/tttt
1运行type pwd
可以确认这一点。
2从阅读链接手册页:-f
,--canonicalize
通过递归地跟踪给定名称的每个组件中的每个符号链接来规范化;除最后一个组件之外的所有组件都必须存在。
答案3
pwd
$PWD
如果它包含不带点.
或点-点的绝对路径名,将打印 的值..
。来自 POSIX密码定义:
-L
If the PWD environment variable contains an absolute pathname of the
current directory that does not contain the filenames dot or dot-dot,
pwd shall write this pathname to standard output. Otherwise, if the PWD
environment variable contains a pathname of the current directory that
is longer than {PATH_MAX} bytes including the terminating null, and the
pathname does not contain any components that are dot or dot-dot, it is
unspecified whether pwd writes this pathname to standard output or
behaves as if the -P option had been specified. Otherwise, the -L option
shall behave as the -P option.
默认情况下,pwd
使用-L
option ,因此它将打印 current 的值PWD
,该值是在使用 时设置的cd
。当你将mv
当前目录改为新路径时,PWD
仍然没有改变,所以你将得到旧的路径名。
您可以通过一些方法来获取正确的新路径名:
- 使用
-P
选项:pwd -P
- 使用
/proc
:ls -l /proc/self/cwd
笔记
作为变量的 POSIX 定义残疾人士,如果应用程序设置或取消设置 的值,则和PWD
的行为未指定。cd
pwd
% cuonglm at /tmp/ttt
% PWD=/home/cuonglm
% cuonglm at ~
% pwd
/tmp/ttt
% cuonglm at ~
% pwd -P
/tmp/ttt