
pwd 命令代表“打印工作目录”(print working directory)。执行时,它会打印出你当前所在目录的完整路径。
本指南通过实际示例讲解如何使用 pwd 命令。
什么是当前工作目录
当前工作目录是你当前正在其中工作的目录。每次你与命令行提示符交互时,都处在一个目录之中。
默认情况下,当你登录 Linux 系统时,当前工作目录会被设为你的主目录(home directory)。要切换工作目录,请使用 cd 命令。
例如,要将当前工作目录切换到 /tmp:
cd
/tmp
如果你自定义了 bash 或 zsh 提示符,当前工作目录的路径可能会显示在 shell 提示符中:
user@host:/tmp$
pwd 命令语法
pwd 的语法如下:
pwd [OPTION]
在大多数现代 shell(如 Bash 和 Zsh)中,pwd 是一个 shell 内建命令。它的行为与我们单独运行的 pwd 可执行文件略有不同。你可以使用 type 命令显示所有包含名为 pwd 的可执行文件的位置:
type
-a pwd
pwd is a shell builtin
pwd is /usr/bin/pwd
shell 内建命令优先级高于独立可执行文件,因此当你输入 pwd 时使用的就是内建版本。要使用独立二进制文件,请输入 type -a pwd 在你的系统上报告的完整路径。
如何查看当前工作目录
要打印当前工作目录,运行:
pwd
/home/linuxize
在普通的交互式 shell 使用中,pwd 与 PWD 环境变量通常显示同一个目录,因此下面这条命令通常会产生相同的输出:
echo
$PWD
/home/linuxize
$PWD 变量在脚本中很有用:当你需要先把当前目录保存下来,再切换到另一个目录、稍后返回时使用。shell 还会维护 $OLDPWD,它保存着上一次工作目录的路径。
pwd 选项
pwd 接受两个选项:
• -L(--logical)——不解析符号链接。按导航路径打印,可能包含符号链接名称。这是默认行为。• -P(--physical)——解析符号链接并打印文件系统在磁盘上的实际物理路径。
为了说明两者的区别,创建一个目录以及一个指向它的符号链接:
mkdir /tmp/directory
ln -s /tmp/directory /tmp/symlink
进入该符号链接并运行 pwd:
cd
/tmp/symlink
pwd
/tmp/symlink
默认的 -L 行为显示导航到的路径,包含符号链接名称。现在运行 pwd -P:
pwd
-P
/tmp/directory
-P 选项会解析符号链接并打印目标目录的真实路径。
在 Shell 脚本中使用 pwd
脚本常常需要知道自身是从哪里运行的,而 pwd 就是用来询问的常用方式。把命令包进 $(...) 中会执行它,并把它的输出替换到所在行,这就是为什么你会在 shell 脚本里看到到处都是 $(pwd):
echo
"Archiving
$(
pwd
)
"
Archiving /home/linuxize/projects
shell 运行 pwd,用它打印的路径替换 $(pwd),然后把拼好的字符串交给 echo。较老的 `pwd` 反引号形式做同样的事,但 $(...) 可以干净地嵌套,也更易读。
实际上 $(pwd) 与 $PWD 返回的路径相同,所以选哪个多半是习惯问题。$PWD 是 shell 始终维护着的变量,读取它不花任何代价,而 $(pwd) 要启动一次命令替换来再次询问。当你需要物理路径时,使用命令形式,因为 $(pwd -P) 没有等价的变量。
一个常见用法是在移动到别处之前先捕获当前目录,之后再返回:
#!/bin/bash
start_dir
=
$(
pwd
)
cd
/tmp/workspace
||
exit
1
make
cd
"
$start_dir
"
这里给 "$start_dir" 加上引号很重要,因为未加引号的、包含空格的路径会被拆分成多个参数。
有一个行为经常让人感到意外:pwd 报告的是脚本的启动目录,而不是脚本文件所在的目录。如果你从主目录运行 ./scripts/build.sh,那么 $(pwd) 就是你的主目录。要找出脚本本身所在的位置,需要从脚本本身推导路径:
script_dir
=
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
内部的 dirname 去掉文件名,cd 进入剩余部分,pwd 打印得到的绝对路径。所有操作都在 $(...) 内运行,使目录切换发生在子 shell 中,因此脚本会从它最初的位置继续往下执行。
快速参考
| Command | Description |
|---|---|
pwd | 打印当前工作目录 |
pwd -L | 按导航路径打印(不解析符号链接) |
pwd -P | 打印物理路径(已解析符号链接) |
echo $PWD | 通过环境变量打印当前目录 |
echo $OLDPWD | 打印上一次工作目录 |
$(pwd) | 将当前目录插入到命令中 |
常见问题(FAQ)
pwd -L 和 pwd -P 有什么区别?pwd -L 按你导航到的路径打印,保留符号链接名称。pwd -P 解析所有符号链接并打印文件系统的真实路径。如果你进入了一个符号链接目录,-L 显示符号链接路径,而 -P 显示实际目标路径。
什么是 $PWD 变量?$PWD 是一个 shell 环境变量,始终保存当前工作目录的路径。每当你切换目录时,shell 都会自动更新它。它等效于运行 pwd,在脚本中用于捕获或引用当前路径很有用。
$(pwd) 和 $PWD 有什么区别?两者都给你当前工作目录。$PWD 是一个已经设置好的 shell 变量,读取它不会启动新进程;而 $(pwd) 运行 pwd 命令并替换其输出。当你需要解析了符号链接的物理路径时,使用 $(pwd -P),因为没有变量保存它。
什么是 $OLDPWD?$OLDPWD 是一个 shell 变量,保存上一次工作目录(即上次 cd 之前所在的目录)的路径。运行 cd - 会切换回 $OLDPWD。
我可以在 shell 脚本中使用 pwd 吗?可以。在脚本中使用 pwd 或 $PWD 是捕获脚本启动所在目录、或根据当前位置构造绝对路径的常见做法。
结论
pwd 命令打印当前工作目录的完整路径。当你需要解析了所有符号链接的物理路径时使用 pwd -P;当你想要导航路径(默认)时使用 pwd -L。