Linux cd命令用于切换当前工作目录,是Linux系统中最基本和最常用的命令之一。
提示: cd命令是bash shell和其他shell的内置命令,因此没有独立的可执行文件。它的功能直接由shell提供。
语法格式
cd [选项] [目录]
常用选项
| 选项 |
说明 |
-L |
跟随符号链接(默认行为) |
-P |
不跟随符号链接,切换到符号链接指向的实际目录 |
-e |
如果目录不存在,返回非零退出状态(某些shell支持) |
@ |
在macOS中切换到文件包目录(仅macOS) |
--help |
显示帮助信息(某些shell支持) |
特殊目录符号
| 符号 |
说明 |
示例 |
. |
当前目录 |
cd .(保持在当前目录) |
.. |
上一级目录(父目录) |
cd ..(切换到父目录) |
~ |
当前用户的家目录 |
cd ~(切换到当前用户家目录) |
~用户名 |
指定用户的家目录 |
cd ~alice(切换到alice用户的家目录) |
- |
上一次所在的目录 |
cd -(切换回上一个目录) |
/ |
根目录 |
cd /(切换到根目录) |
使用示例
示例1:切换到绝对路径目录
# 切换到/etc目录
cd /etc
# 切换到/usr/local/bin目录
cd /usr/local/bin
# 切换到用户alice的家目录
cd /home/alice
示例2:使用相对路径切换目录
# 假设当前目录为/home/user
# 切换到当前目录下的documents子目录
cd documents
# 切换到上一级目录
cd ..
# 切换到上两级目录
cd ../..
# 切换到兄弟目录
cd ../sibling_dir
示例3:使用特殊符号切换目录
# 切换到当前用户的家目录
cd ~
# 或简写为
cd
# 切换到alice用户的家目录
cd ~alice
# 切换到根目录
cd /
# 切换到上次所在的目录
cd -
示例4:处理包含空格或特殊字符的目录名
# 目录名包含空格,需要用引号括起来或使用转义
cd "My Documents"
# 或
cd My\ Documents
# 目录名包含特殊字符,使用引号
cd "dir with & special chars"
# 或使用转义字符
cd dir\ with\ \&\ special\ chars
示例5:使用环境变量切换目录
# 切换到HOME环境变量指定的目录
cd $HOME
# 切换到OLDPWD环境变量指定的目录(上次所在的目录)
cd $OLDPWD
# 使用自定义环境变量
export PROJECT_DIR="/home/user/projects"
cd $PROJECT_DIR
示例6:选项使用
# 创建符号链接并测试cd选项
ln -s /home/user/real_dir link_dir
# 默认跟随符号链接
cd link_dir
pwd # 输出:/home/user/link_dir
# 不跟随符号链接
cd -P link_dir
pwd # 输出:/home/user/real_dir
示例7:在实际脚本中使用
#!/bin/bash
# 备份脚本示例
# 切换到备份源目录
cd /var/www/html || {
echo "错误:无法切换到/var/www/html目录"
exit 1
}
# 执行备份操作
tar -czf /backups/website_$(date +%Y%m%d).tar.gz .
# 切换回脚本开始时的目录
cd - > /dev/null
echo "备份完成"
示例8:高级用法和技巧
# 使用命令替换切换目录
cd $(find /home -name "project" -type d | head -1)
# 使用通配符切换目录(如果有多个匹配,进入第一个)
cd /usr/lib*/python*
# 使用pushd和popd进行目录栈操作
pushd /var/log # 进入/var/log并保存当前目录到栈
pushd /etc # 进入/etc并保存/var/log到栈
popd # 返回/var/log
popd # 返回原始目录
# 使用CDPATH环境变量设置常用目录搜索路径
export CDPATH=.:~:/etc:/var
cd log # 会尝试切换到./log, ~/log, /etc/log, /var/log
示例9:目录不存在时的处理
# 尝试切换到不存在的目录
cd /nonexistent/directory
# 输出:bash: cd: /nonexistent/directory: No such file or directory
# 在脚本中处理目录不存在的情况
if cd /nonexistent/directory 2>/dev/null; then
echo "目录切换成功"
else
echo "目录不存在,切换失败"
fi
# 使用逻辑或操作符
cd /tmp/subdir || mkdir -p /tmp/subdir && cd /tmp/subdir
cd命令的工作原理
cd命令作为shell内置命令,其工作原理如下:
- shell解析用户输入的cd命令和参数
- 检查目标目录是否存在且用户是否有访问权限
- 如果目录存在且有权限,shell更新当前工作目录环境变量(PWD)
- 更新OLDPWD环境变量保存之前的工作目录
- 更新shell提示符(如果提示符包含当前目录信息)
环境变量相关
| 环境变量 |
说明 |
PWD |
当前工作目录的绝对路径 |
OLDPWD |
上一次工作目录的绝对路径 |
HOME |
当前用户的家目录路径 |
CDPATH |
cd命令搜索目录的路径列表 |
注意:
- cd命令是shell内置命令,因此不会创建新的进程
- 如果没有指定目录参数,cd会切换到HOME环境变量指定的目录
- 使用
cd -时,会在当前目录和上一个目录之间切换
- 目录路径中的波浪号(~)会在命令执行前由shell展开
- 当目录不存在或没有权限时,cd命令会失败并显示错误信息
- 在脚本中使用cd命令时,最好检查返回值以确保切换成功
- CDPATH环境变量可以方便地切换到常用目录,但可能引起混淆
- 符号链接的处理方式可以通过-L和-P选项控制
常见问题解决
问题:目录不存在
# 错误:bash: cd: /nonexistent: No such file or directory
# 解决:检查目录路径是否正确,或先创建目录
mkdir -p /path/to/directory
cd /path/to/directory
问题:权限不足
# 错误:bash: cd: /root: Permission denied
# 解决:使用sudo或切换到有权限的用户
sudo cd /root # 注意:这不会工作,因为cd是内置命令
# 正确做法:使用sudo -i或切换到root用户
问题:包含特殊字符的目录名
# 目录名:dir with spaces
# 正确用法:
cd "dir with spaces"
# 或
cd dir\ with\ spaces
问题:符号链接处理
# 如果需要切换到符号链接指向的实际目录
cd -P symbolic_link
# 如果需要切换到符号链接本身所在目录
cd -L symbolic_link # 默认行为
高级技巧
1. 使用别名简化常用目录切换
# 在~/.bashrc中添加别名
alias cddocs='cd ~/Documents'
alias cdweb='cd /var/www/html'
alias cdtmp='cd /tmp'
# 使别名生效
source ~/.bashrc
# 使用别名
cddocs # 切换到~/Documents
2. 使用函数实现更复杂的目录切换
# 在~/.bashrc中添加函数
# 快速切换到最近修改的目录
cdlatest() {
local latest_dir
latest_dir=$(ls -t | head -1)
if [ -d "$latest_dir" ]; then
cd "$latest_dir"
else
echo "未找到目录: $latest_dir"
fi
}
# 切换到包含特定文件的目录
cdto() {
local target="$1"
local found_dir
found_dir=$(find . -name "$target" -type f | head -1 | xargs dirname)
if [ -n "$found_dir" ]; then
cd "$found_dir"
else
echo "未找到包含 $target 的目录"
fi
}
3. 使用目录栈(pushd/popd)
# 保存当前目录并切换到新目录
pushd /var/log
# 再次保存并切换
pushd /etc
# 查看目录栈
dirs -v
# 返回上一个目录
popd
# 返回原始目录
popd
cd命令在不同shell中的差异
| Shell |
cd命令特点 |
| Bash |
支持CDPATH,cd -,自动补全 |
| Zsh |
增强的自动补全,目录历史,cd -n切换历史目录 |
| Fish |
更智能的目录切换,支持cdh查看目录历史 |
| Ksh |
基本功能与Bash类似 |
| Tcsh/Csh |
语法略有不同,支持cd和chdir |
相关命令
pwd - 显示当前工作目录
ls - 列出目录内容
mkdir - 创建新目录
rmdir - 删除空目录
pushd - 将目录保存到栈并切换
popd - 从栈中恢复目录