你在终端里一顿操作,cd 进了好几层目录,突然有点恍惚:“我现在到底在哪个目录?”
或者你刚执行完一个脚本,脚本报错说找不到文件,你怀疑自己是不是走错了地方。
这时候,你需要一个简单但可靠的命令——pwd。它就像你手机上的定位图标,一秒钟告诉你当前的精确位置。
别看它简单,关于 pwd 有两个容易踩的坑:软链接路径和 符号链接的物理位置。搞懂这些,你才算真正掌握了 pwd。
一、pwd 命令的作用与基础用法
pwd 是 print working directory 的缩写,用于输出当前工作目录的绝对路径。
基础语法:
pwd [选项]
使用示例:
$ pwd
/home/alice
没有任何花哨的输出,就是一行干净的绝对路径。
💡 新手提示:当你打开一个新的终端窗口,默认就在你的家目录(/home/用户名)。可以用 pwd 验证一下。
二、核心知识点:pwd 的两个版本
在 Linux 中,pwd 实际上有两个版本:
- Shell 内置命令
- 外部命令
$ typepwd
pwd is a shell builtin
$ whichpwd
/bin/pwd
大多数情况下你使用的是 shell 内置的 pwd,它更方便、更快。两个版本的行为基本一致,但有一些细微差别(下面会提到)。
三、软链接路径问题(最容易踩的坑)
这是 pwd 命令最大的“陷阱”所在。
场景重现
假设你有这样一个目录结构:
/home/alice/
├── real_folder/
│ └── data.txt
└── link_folder -> real_folder # 这是一个软链接(符号链接)
当你通过软链接进入目录后,pwd 默认显示的是你进入的路径,而不是实际物理路径。
$ cd /home/alice/link_folder
$ pwd
/home/alice/link_folder # 显示的是链接路径
但如果你使用 pwd -P(物理路径),它会显示真实的目录位置:
$ pwd -P
/home/alice/real_folder
为什么会有这个区别?
- 逻辑路径(-L):按照符号链接的“逻辑”显示路径,即你 cd 时使用的路径。这是
pwd 的默认行为(-L 选项)。 - 物理路径(-P):解析所有符号链接,显示文件系统上的真实物理位置。
实际应用场景
什么时候需要 pwd -P?
当你写脚本时,需要获取脚本所在目录的真实物理路径,而不是通过链接进来的路径。例如:
#!/bin/bash
SCRIPT_DIR=$(cd"$(dirname "$0")" && pwd -P)
echo"脚本实际存放位置: $SCRIPT_DIR"
⚠️ 注意:/bin/pwd 默认行为是 -P(显示物理路径),而 shell 内置的 pwd 默认是 -L。这就是它们之间的主要区别。为了可移植性,建议显式使用 -P 或 -L 选项。
四、常用选项详解
验证当前 pwd 的类型:
$ pwd -L # 逻辑路径
$ pwd -P # 物理路径
五、实际应用场景
1. 确认当前目录,避免操作错误
在删除、移动、复制文件前,先用 pwd 确认位置:
$ pwd
/home/alice/Downloads
$ rm *.tmp # 确认在 Downloads 下删除,不会误删其他目录
2. 脚本中获取当前脚本所在目录
常见的模式:
#!/bin/bash
CURRENT_DIR=$(pwd)
echo"脚本被调用时的目录: $CURRENT_DIR"
# 更健壮的方式:获取脚本文件本身的目录
SCRIPT_DIR=$(cd"$(dirname "$0")" && pwd -P)
3. 配合其他命令使用
pwd 常被用在命令替换中:
$ echo"当前目录是: $(pwd)"
当前目录是: /home/alice
$ ls -l $(pwd)/file.txt # 等价于 ls -l /home/alice/file.txt
4. 与 cd - 配合,查看上一个目录
cd - 切换到上一个目录,但不会显示路径。你可以先用 pwd 再看:
$ cd /var/log
$ cd /etc
$ pwd
/etc
$ cd -
/var/log
$ pwd
/var/log
六、常见坑与避坑指南
| | |
|---|
| 通过软链接进入目录,pwd 显示链接路径,导致脚本找错文件 | |
| 如果脚本被其他目录下的程序调用,pwd 返回的是调用目录,不是脚本所在目录 | 用$(cd "$(dirname "$0")" && pwd -P) 代替 |
❌ 忘记pwd 和 /bin/pwd 的默认行为差异 | 在设置了POSIXLY_CORRECT 环境变量或某些 shell 中,行为可能不同 | |
| 如果当前目录被删除(例如另一个终端删除了该目录),pwd 会报错 | 了解可能出现的pwd: error retrieving current directory |
示例:当前目录被删除后的错误
# 终端1
$ mkdir test && cdtest
$ pwd
/home/alice/test
# 终端2(同一台机器)
$ rm -rf /home/alice/test
# 回到终端1,执行任何命令都可能报错
$ pwd
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
解决方法:cd 到一个存在的目录即可。
七、高级技巧:pwd 与 $PWD 环境变量
Bash 会自动维护一个环境变量 $PWD,保存当前目录的绝对路径(逻辑路径)。
$ echo$PWD
/home/alice/link_folder
$PWD 的值等同于 pwd -L。你可以直接使用这个变量,不需要调用外部命令,效率更高。
$ cd /tmp
$ echo"$PWD/somefile"
/tmp/somefile
💡 提示:在脚本中频繁获取当前目录时,使用 $PWD 比执行 pwd 命令更快(因为不涉及 fork 子进程)。
八、总结
pwd 虽小,但有两个核心要点:
- 基本用法:直接输入
pwd 显示当前绝对路径(逻辑路径,保留符号链接)。 - 物理路径
- 环境变量
- 脚本注意:不要用
pwd 获取脚本所在目录,应该用 $(cd "$(dirname "$0")" && pwd -P)。
记住:当你迷路时,pwd 就是你的指南针。用它确认位置,再配合 ls 和 cd,你永远不会在文件系统中迷失方向。
如果你觉得本文对你有帮助,欢迎点赞、推荐、转发,关注我,后续会分享更多Linux入门干货!
文 / 零距技术仓
记录每一次真实的折腾 (#^.^#)
🚀 想看到更多实用折腾技巧?
👉 先关注
💬 评论区说说你的经历或想看的内容
👍 点赞表示支持
🔁 顺手分享给也在折腾的人,让大家都少踩坑 😎