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 builtin),其行为与独立的 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 中,因此脚本会从它原本的起始位置继续往下执行。
快速参考
| 命令 | 说明 |
|---|---|
pwd | 打印当前工作目录 |
pwd -L | 按导航路径打印(不解析符号链接) |
pwd -P | 打印物理路径(解析符号链接) |
echo $PWD | 通过环境变量打印当前目录 |
echo $OLDPWD | 打印上一个工作目录 |
$(pwd) | 将当前目录插入到命令中 |
常见问题
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。