cd 是什么
cd 是 shell 内建命令,改变的是当前 shell 进程自己的工作目录,因此它无法被外部命令「代执行」:sudo cd、find -exec cd 都不会生效,因为子进程改了目录也不会影响当前 shell。另一个容易忽略的点是路径解析方式——默认使用逻辑路径,保留符号链接的写法,只有加 -P 才会解析到物理路径,这正是 pwd 与 pwd -P 结果可能不同的原因。
基本信息
| 适用平台 | 所有 POSIX shell(bash、dash、zsh、ksh)的内建命令;Windows cmd 的 cd 行为不同 |
|---|---|
| 命令语法 | cd [选项] [目录] |
| 常用形式 | cd 回 $HOME、cd - 回上一次目录、cd ~user 进入指定用户家目录、cd .. 上级目录、cd /绝对路径、cd 相对路径 |
| 相关变量 | $HOME 家目录、$OLDPWD 上一次目录、$PWD 当前目录、$CDPATH 搜索路径 |
| 权限要求 | 需要对目标目录有执行权限(x),缺少时报 Permission denied;只有读权限能看见名字却进不去 |
典型使用场景
- 在多个项目目录间来回切换:cd - 快速回到上一个位置,避免重复输入长路径
- 脚本开头切换工作目录:确保后续相对路径指向预期位置,通常配合失败即退出
- 进入服务账号家目录检查环境:cd ~deploy 查看该账号的配置文件与脚本
- 子 shell 内临时切换:(cd /tmp && tar xf a.tar) 不影响当前 shell 的目录
- 进入符号链接目录并确认真实落点:用 cd -P 与 pwd -P 看物理路径
- 打包前定位父目录:先切到父目录再用相对路径操作,避免绝对路径带来的前导斜杠
常用示例
常用示例
cd /var/log
cd # 回到 $HOME
cd - # 回到上一次目录并打印路径
cd ~deploy # 进入 deploy 用户家目录
cd .. # 上一级目录
cd -P /srv/app-current # 解析符号链接,进入物理路径
cd -- -weird-dir # 目录名以短横线开头时用 -- 结束选项解析
(cd /tmp && ls -l) # 子 shell 内切换,不影响当前位置
cd /srv/app || exit 1 # 脚本中失败即退出
pwd -P # 查看当前目录的物理路径常用写法对照
| 写法 | 含义 | 注意 |
|---|---|---|
| cd | 回到 $HOME | 脚本里 $HOME 可能未定义,改用绝对路径 |
| cd - | 回到上一次目录并打印该路径 | 依赖 $OLDPWD,首次执行时可能为空 |
| cd .. | 进入上级目录 | 在符号链接路径下与物理含义可能不同 |
| cd ~用户 | 进入指定用户家目录 | 需要该目录的执行权限 |
| cd -P | 按物理路径解析符号链接 | 排查真实落点时使用 |
| cd -L | 按逻辑路径解析(默认行为) | 保留链接写法,便于阅读 |
逻辑路径与物理路径的差异在实践中很具体:项目部署常用软链接指向不同发布目录(例如 app-current 指向 app-2026-10),此时 cd 进入链接后,.. 会按逻辑路径回到链接所在位置,而不是真实发布目录的上级。需要按物理结构操作时用 cd -P 或 pwd -P 确认。
CDPATH 可以让 cd 在给定目录列表里搜索目标名,实现快捷跳转,但它也会带来意外:脚本中使用 CDPATH 时,cd 可能悄悄进入另一处同名目录,还会把选中路径打印出来干扰输出。交互环境可用,脚本里建议显式取消。
脚本里 cd 之后一定要处理失败情况(cd 路径 || exit 1,或开启 set -e)。cd 失败但脚本继续执行时,后续的相对路径命令会作用在错误的目录上,删除与覆盖类操作的后果尤其严重。
目录栈相关命令
| 命令 | 作用 | 备注 |
|---|---|---|
| pushd 目录 | 进入目标目录并把原位置压入栈 | 适合在三个以上目录间来回跳 |
| popd | 弹出栈顶目录并切过去 | 与 pushd 成对使用 |
| dirs -v | 列出栈内条目与编号 | 编号可用于 pushd +N 定点跳转 |
| cd - | 切回上一次目录 | 只交换两个位置,不涉及栈 |
交互式 bash 可打开 shopt -s cdspell,cd 在目录名拼写错误时自动纠正;该选项只对 bash 有效且脚本里默认不开启,无人值守任务不能依赖它兜底,路径仍要写准。目录栈也只在当前 shell 内有效,退出登录后不保留。