linux cd命令

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内置命令,其工作原理如下:

  1. shell解析用户输入的cd命令和参数
  2. 检查目标目录是否存在且用户是否有访问权限
  3. 如果目录存在且有权限,shell更新当前工作目录环境变量(PWD)
  4. 更新OLDPWD环境变量保存之前的工作目录
  5. 更新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 语法略有不同,支持cdchdir

相关命令

  • pwd - 显示当前工作目录
  • ls - 列出目录内容
  • mkdir - 创建新目录
  • rmdir - 删除空目录
  • pushd - 将目录保存到栈并切换
  • popd - 从栈中恢复目录