Linux命令-pwd(打印当前工作目录)
Linux命令-pwd(打印当前工作目录)
- 快速参考
- 命令语法
- 常用选项
- 核心概念:逻辑路径 vs 物理路径
- 实战示例
- 1. 基础使用
- 2. 逻辑路径(-L)示例
- 3. Shell 内置 vs 外部命令
- 4. 脚本中的实用模式
- 5. 在提示符中使用 pwd
- 6. 高级:符号链接迷宫排查
- 7. $PWD 环境变量
- 发行版差异
- pwd vs realpath vs readlink -f
- 总结
快速参考
pwd(Print Working Directory)是 Linux 中最简单也最常用的命令之一——它告诉你"我现在在哪"。尽管功能看似琐碎,但pwd在符号链接密集的环境中有着微妙的差异:pwd默认(-L)显示逻辑路径,而pwd -P显示物理真实路径。
在 Linux 文件系统的迷雾中,
pwd就是你的指南针。它只有两个选项,但理解它们的区别能帮你避免在符号链接迷宫中迷失方向。
命令语法
pwd [选项]常用选项
| 选项 | 功能 |
|---|---|
-L | 显示逻辑路径(默认,包含符号链接) |
-P | 显示物理路径(解析所有符号链接) |
--help | 显示帮助 |
--version | 显示版本 |
核心概念:逻辑路径 vs 物理路径
物理文件系统布局: / ├── var/ │ └── run/ │ └── myservice/ │ └── data/ ├── tmp/ │ └── runtime → /var/run/myservice/ # 符号链接 当你执行: $ cd /tmp/runtime/data/ $ pwd (/tmp/runtime/data/ 逻辑路径,你看到的路径) $ pwd -P (/var/run/myservice/data/ 物理路径,文件系统真实位置)实战示例
1. 基础使用
# 最基本用法$pwd/home/alice# 在脚本中获取当前目录$CURRENT_DIR=$(pwd)$echo"Working in:$CURRENT_DIR"Working in: /home/alice/projects/myapp# 使用反引号(旧语法)$OLDDIR=`pwd`$echo$OLDDIR# 保存当前目录并恢复(脚本常用)$SAVED_DIR=$(pwd)$cd/tmp $# ... do something in /tmp ...$cd"$SAVED_DIR"# 回到原目录2. 逻辑路径(-L)示例
# -L 是默认行为:为你显示你"如何来到"这个目录的$mkdir-p/var/data/storage $ln-s/var/data/storage /tmp/mystorage $cd/tmp/mystorage $pwd-L/tmp/mystorage# 你使用的符号链接路径$pwd-P/var/data/storage# 文件系统上的真实路径# 另一个例子$cd/usr/lib $pwd/usr/lib $ls-ld/usr/lib lrwxrwxrwx1root root7Jan12023/usr/lib ->usr/lib# /usr/lib 实际上是符号链接!$pwd-P/usr/usr/lib# 等等,这不对...# 实际上在现代系统中 /usr/lib 指向的是 usr/lib (相对路径)# 更常见的例子:$ls-ld/lib lrwxrwxrwx1root root7Jan12023/lib ->usr/lib $cd/lib $pwd-L/lib $pwd-P/usr/lib3. Shell 内置 vs 外部命令
# pwd 既是 Shell 内置命令,也是外部可执行程序# Shell 内置版本(bash 使用)$typepwdpwdis a shellbuiltin# 外部程序版本$whichpwd/usr/bin/pwd $ /usr/bin/pwd /home/alice# 主要区别:Shell 内置的 pwd 记住了你的"逻辑"路径# 外部 /usr/bin/pwd 行为取决于选项# 使用外部程序的 pwd$ /usr/bin/pwd-P# 强制使用外部命令而非内置$commandpwd-P$envpwd-P4. 脚本中的实用模式
# 获取脚本所在目录的绝对路径(重要!)SCRIPT_DIR="$(cd "$(dirname"${BASH_SOURCE[0]}")"&&pwd-P)" echo "Script directory:$SCRIPT_DIR" # 无论脚本被从哪里调用,都能正确获取真实目录 # 更健壮的版本 get_script_dir() { local source="${BASH_SOURCE[0]}" while [ -h "$source" ]; do local dir="$(cd-P"$(dirname"$source")"&&pwd)" source="$(readlink"$source")" [[$source!= /* ]] && source="$dir/$source" done cd -P "$(dirname"$source")" && pwd } SCRIPT_DIR=$(get_script_dir)# 创建临时目录并切换 work_in_temp() { local savedir=$(pwd)local tmpdir=$(mktemp-d)cd "$tmpdir" echo "Workingin$tmpdir" # ... do work ... cd "$savedir" rm -rf "$tmpdir" } # 相对路径转绝对路径 resolve_path() { local path="$1" if [ -d "$path" ]; then (cd "$path" && pwd -P) else (cd "$(dirname"$path")" && echo "$(pwd-P)/$(basename"$path")") fi } # 检查是否在某个目录下 is_under_path() { local check_dir="$1" [[ "$(pwd-P)" == "$(cd"$check_dir"&&pwd-P)"* ]] } if is_under_path "/home"; then echo "Working inside /home"fi5. 在提示符中使用 pwd
# PS1 中显示当前目录$PS1='[\u@\h \W]\$ '# \W 显示当前目录名[alice@server projects]$# 只显示目录名$PS1='[\u@\h \w]\$ '# \w 显示完整路径[alice@server ~/projects/myapp]$# 自定义提示符中显示物理路径$PS1='[\u@\h $(pwd -P)]\$ '# 截断长路径short_pwd(){localdir=$(pwd-P)localhome=${HOME%/}dir=${dir/#$home/\~}echo"$dir"}$PS1='[\u@\h $(short_pwd)]\$ '6. 高级:符号链接迷宫排查
# 场景:你 cd 到了一个目录,但感觉路径不对# 第一步:查看逻辑路径$pwd/opt/myapp/config# 第二步:查看物理路径$pwd-P/usr/local/myapp-v2.3/config# 第三步:追踪符号链接链$ namei-l/opt/myapp f: /opt/myapp drwxr-xr-x root root / drwxr-xr-x root root opt lrwxrwxrwx root root myapp ->/usr/local/myapp-v2.3# 第四步:查看所有父目录是否有符号链接$ readlink-f.# 同样给出物理路径/usr/local/myapp-v2.3/config# 第五步:如果觉得迷惑,使用 realpath$ realpath./usr/local/myapp-v2.3/config# 对比:逻辑 vs 物理$echo"Logical:$(pwd-L)"Logical: /opt/myapp/config $echo"Physical:$(pwd-P)"Physical: /usr/local/myapp-v2.3/config7. $PWD 环境变量
# Shell 维护一个 $PWD 环境变量$echo$PWD/home/alice# cd 后自动更新$cd/tmp $echo$PWD/tmp# $PWD 通常等于 pwd -L(逻辑路径)$cd/tmp/mystorage# (符号链接目录)$echo$PWD/tmp/mystorage $pwd-L/tmp/mystorage $pwd-P/var/data/storage# 注意:$PWD 和 pwd -P 可能不同!发行版差异
pwd在所有 Linux 发行版和 Unix 系统中行为完全一致(POSIX 标准)。
| 系统 | Shell 内置 | 外部命令 |
|---|---|---|
| 所有 Linux | bash/zsh/dash 都内置 | /usr/bin/pwd(coreutils) |
| macOS | bash/zsh 内置 | /bin/pwd(BSD) |
| FreeBSD | sh/bash/zsh 内置 | /bin/pwd |
| BusyBox | ash 内置 | /bin/pwd |
pwd vs realpath vs readlink -f
| 命令 | 输出 | 用途 |
|---|---|---|
pwd -P | 物理路径 | 获取真实文件系统路径 |
realpath . | 物理路径(解析所有符号链接) | 同 pwd -P |
readlink -f . | 物理绝对路径 | 同 realpath |
pwd -L | 逻辑路径 | 保留符号链接的路径 |
# 三者等价$pwd-P/var/data/storage $ realpath./var/data/storage $ readlink-f./var/data/storage总结
pwd简单但不"简陋":
- 获取当前目录最基本的方式
-Pvs-L的区别是理解文件系统符号链接的关键- 在脚本中用
$(cd "$(dirname "$0")" && pwd -P)获取脚本的真实物理路径 - Shell 内置的
pwd和外部程序的/usr/bin/pwd通常行为一致
在符号链接密集的环境中(如
/lib、/usr/lib、容器挂载点),pwd -P是你区分"你以为在哪"和"你实际在哪"的唯一方式。
