什么是当前工作目录(pwd 命令详解:语法、选项与 Shell 脚本实战)

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 中,因此脚本会从它最初的位置继续往下执行。

快速参考

CommandDescription
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。