pwd 和 $PWD 之间的使用差异

pwd 和 $PWD 之间的使用差异

打印当前/当前的工作目录环境变量 $PWD命令 pwd都可用。那么,两者的使用有什么区别?或者针对特定目的应该选择什么?

答案1

这取决于你在做什么。首先,$PWD是一个环境变量,pwd是一个 shell 内置命令或一个实际的二进制文件:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

$PWD现在,除非您使用该标志,否则bash 内置命令将仅打印当前的值-P。如中所述help pwd

pwd: pwd [-LP]
Print the name of the current working directory.

Options:
  -L    print the value of $PWD if it names the current working
    directory
  -P    print the physical directory, without any symbolic links

By default, `pwd' behaves as if `-L' were specified.

pwd另一方面,二进制文件通过系统调用获取当前目录,getcwd(3)该系统调用返回与 相同的值readlink -f /proc/self/cwd。为了说明这一点,尝试移动到链接到另一个目录的目录:

$ ls -l
total 4
drwxr-xr-x 2 terdon terdon 4096 Jun  4 11:22 foo
lrwxrwxrwx 1 terdon terdon    4 Jun  4 11:22 linktofoo -> foo/
$ cd linktofoo
$ echo $PWD
/home/terdon/foo/linktofoo
$ pwd
/home/terdon/foo/linktofoo
$ /bin/pwd
/home/terdon/foo/foo

因此,总而言之,在 GNU 系统(例如 Ubuntu)上,pwdecho $PWD是等效的,除非您使用-P选项,但/bin/pwd不同且行为类似于pwd -P

答案2

如果对所有工作目录(包括符号链接)使用它们而不使用选项,则两者都将返回相同的结果。

然而,来自man pwd

-P, --physical
    avoid all symlinks

这意味着pwd -P当指向其他目录的符号链接时执行将打印原始目录的路径。

例如,如果你有一个/var/run指向的符号链接/run,并且你当前在/var/run/目录中,则执行

echo $PWD

将返回:

/var/run

和 的结果相同pwd。但是,如果您执行:

pwd -P

将返回

/run

因此,这取决于您需要哪个路径:没有符号链接的实际路径或忽略符号链接的当前目录。pwd -P和之间的唯一区别echo $PWD在于是否存在符号链接。

相关内容