首页/系统/Linux 运维命令速查/cd 切换工作目录
文件与目录76 条

cd 切换工作目录

Shell 内建命令,切换当前工作目录;支持回上一次目录、回家目录、经 CDPATH 快捷跳转。

Linux 运维命令速查系统更新于 2026-10-13

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 内有效,退出登录后不保留。

易错点

  • cd 是 shell 内建,sudo cd 与 find -exec cd 都不会改变当前 shell 的目录,跨用户目录请用 sudo -i 或子 shell
  • 默认使用逻辑路径,符号链接下的 .. 与物理含义不同,需要真实路径时用 cd -P 并配合 pwd -P 确认
  • 脚本里 cd 失败没有判断,后续命令在错误目录执行,删除与覆盖类操作可能误伤其他数据
  • 依赖 $HOME 与 $OLDPWD 的写法在 cron、systemd 与无登录环境里可能取到空值,脚本中应使用绝对路径
  • CDPATH 在脚本里可能让 cd 进入同名但不相关的目录,并顺带把路径打印到输出中
  • 把目录栈当成长久记录:pushd/popd 的状态随 shell 结束而消失,跨会话定位目录还是要靠绝对路径或变量

数据来源与参考

  • man 1 bash(Bash 内建命令 cd)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌