pwd打印当前工作目录,相对路径都以它为基准。
约 1204 字大约 4 分钟
2026-05-14
“文件明明在,命令却说找不到”——这类问题十有八九是路径理解出了偏差。绝对路径、相对路径、当前工作目录、家目录,这几个概念看着简单,但脚本一旦放到 cron 或别的目录里执行,没搞清楚就会翻车。
区分绝对路径与相对路径,理解当前工作目录如何影响相对路径,避免脚本和命令找错位置。
pwd打印当前工作目录,相对路径都以它为基准。
cd -在两个目录间来回切换很方便。
realpath ./file把相对路径、软链接解析成真实的绝对路径。
cd ~user~ 是自己的家,~user 是指定用户的家目录。
这是最核心的区分:
/ 写起,比如 /var/log/nginx/error.log。它在任何目录下都指向同一个文件,不受你“现在在哪”影响。/ 开头,比如 log/error.log 或 ../config。它从当前工作目录算起。所以同一句 cat config.yml,在 /app 下执行和在 /tmp 下执行,读的是两个文件。判断一个路径是不是稳定,就看它开不开头是 /。
每个 Shell、每个进程都有一个“当前工作目录”(cwd)。pwd 打印它,cd 改变它。所有相对路径都以它为原点展开。
一个关键事实:脚本运行时的 cwd,不一定是脚本所在的目录。你在 /home/me 下执行 /opt/tools/backup.sh,脚本里的 cwd 是 /home/me,不是 /opt/tools。脚本里写 ./config 就会去 /home/me/config 找——这是定时任务“手动跑正常、cron 里失败”的高频原因。
| 符号 | 含义 |
|---|---|
. | 当前目录 |
.. | 上一级目录 |
~ | 当前用户的家目录 |
~user | 指定用户的家目录 |
- | cd - 表示上一个待过的目录 |
/ | 根目录;也是路径分隔符 |
~ 由 Shell 展开,所以 cd ~ 能用,但写进单引号 '~/file' 就不会展开——这点和 引号、转义与通配符 有关。
让脚本不受“在哪执行”影响,常见两种做法:
# 做法一:全部用绝对路径
cat /opt/myapp/config.yml
# 做法二:先算出脚本自己所在目录,再以它为基准
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
cat "$SCRIPT_DIR/config.yml"交互操作时随手 pwd 确认位置;写脚本时则要主动决定基准,而不是默认“当前目录就是我想的那个”。
删除、移动前先确认 pwd 和目标
rm -r ./data、mv * /backup 这类命令,杀伤力取决于你此刻在哪个目录。动手前先 pwd 看清位置,再用 ls 把相对路径实际指向的内容列出来确认。带空格的路径记得加引号,否则会被拆成多个参数。
| 误区 | 更稳妥的做法 |
|---|---|
| 以为脚本的当前目录就是脚本所在目录 | 脚本 cwd 是调用者的目录;用绝对路径或基于 $0 算出脚本目录 |
| 在不确定位置时直接跑带相对路径的危险命令 | 先 pwd、再 ls 确认相对路径实际指向哪里 |
| 路径含空格不加引号 | 一律 "$path",否则一个路径被拆成多个参数 |
看到 No such file 只反复检查文件名 | 同时检查 cwd、中间目录是否存在、软链接目标是否还在 |
版权归属:Shuo Liu