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。