pwd 和 .以不同的方式确定当前路径?

pwd 和 .以不同的方式确定当前路径?

主要是因为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使用-Loption ,因此它将打印 current 的值PWD,该值是在使用 时设置的cd。当你将mv当前目录改为新路径时,PWD仍然没有改变,所以你将得到旧的路径名。

您可以通过一些方法来获取正确的新路径名:

  • 使用-P选项:pwd -P
  • 使用/procls -l /proc/self/cwd

笔记

作为变量的 POSIX 定义残疾人士,如果应用程序设置或取消设置 的值,则和PWD的行为未指定。cdpwd

% cuonglm at /tmp/ttt
% PWD=/home/cuonglm
% cuonglm at ~
% pwd
/tmp/ttt
% cuonglm at ~
% pwd -P
/tmp/ttt

相关内容