我记得第一次接触 Linux 的时候跟着教程敲命令最懵的就是这个“cd”。明明就是一个切换目录的指令但一会儿“cd /home/user”能进一会儿“cd ../..”能退一会儿又是“cd ~”回到家目录到底什么是什么那时候如果有个老手告诉我“cd 只是表面功夫真正的分水岭是你看没看懂‘绝对路径’和‘相对路径’这两兄弟”我可能能少走一个礼拜的弯路。其实不只是新手我后来在带项目、帮同事排查问题的时候也发现很多写了几年代码的人在脚本里处理路径仍然会翻车。比如 Linux 定时任务里 cd 了一个不存在的目录或者把相对路径写进 systemd 服务导致服务起不来。这些问题的根源其实都能追溯到对路径体系的理解不够扎实。所以这篇就专门把cd 指令、相对路径、绝对路径这桌“基础菜”掰开揉碎了讲清楚。适合刚接触 Linux 的初学者也适合那些命令用了不少但想彻底搞懂底层逻辑的老朋友。看完之后你不仅能熟练用 cd 在各个目录之间自由穿梭还能在写脚本、配服务的时候避开那些让人抓狂的路径坑。1. 搞懂路径体系才算真正进了 Linux 的门1.1 目录树、根目录与“当前工作目录”Linux 世界里所有文件和目录都挂在一棵虚拟的“目录树”上树根就是/也就是根目录。根目录下面有/bin、/etc、/home、/usr这些系统自带的目录用户自己建的文件也在这棵树上找位置。这和 Windows 的 C 盘、D 盘这种“多棵树”结构有本质区别——在 Linux 里不管你有几块硬盘最终都会被“挂载”到这个单一目录树的某个节点上。操作系统内核在运行一个 shell比如 bash的时候会记住一个“当前所在位置”专业说法叫当前工作目录pwd。你每敲一条命令其实都默认是在当前工作目录下执行的。比如你直接敲ls列出来的就是当前目录的内容。而cd指令的作用只有一个改变当前工作目录。这个理解非常重要。我见过不少新手把 cd 当成某种“打开文件夹”的魔法以为敲了 cd 之后系统会记录一串什么特殊状态。其实没有那么复杂cd 的本质就是让 shell 进程更新一下自己维护的“当前位置”变量仅此而已。搞清楚这一点后面看相对路径就不会糊涂了。1.2 为什么说 cd 是使用频率最高的命令之一在 Linux 上做事无论你是看日志、改配置、跑脚本、部署服务第一步几乎都是“先切到对应目录”。日常运维场景里cd配合ls、cat、vim、grep这些指令构成了最基本的操作循环。你不会 cd后面所有操作都像是在谜宫里瞎摸。也有人抬杠说现在用 IDE 或者可视化工具不就行了但现实情况是服务器上没有图形界面出问题时要一条命令一条命令去查自动化脚本里也要用 cd 切目录Docker 构建、GitLab Runner 执行任务时工作目录的初始化就是关键环节。cd 和路径理解是 Linux 技能树里必须点满的基础节点没有捷径。2. cd 指令的完整用法与关键细节2.1 从最简单的“cd 目录名”说起cd 的基本用法就是后面跟一个目标路径这个路径可以是绝对的也可以是相对的。举个例子cd /home/zhangsan/projects/website这条命令不管你现在在哪个目录都会直接跳到/home/zhangsan/projects/website。如果你当前已经在/home/zhangsan下面也可以这样写cd projects/website效果一模一样但含义不同第一条是绝对路径第二条是相对路径。实际使用中有一个很容易被忽略的点cd 后面跟的路径必须真实存在不然 shell 会报错而且不会帮你切换。很多人以为 cd 失败了还在原地但当前目录其实没变。在脚本里如果有cd xxx do_sth的写法cd 一旦失败后面的命令也不会执行。这是好的写法能避免在错误目录里跑出不可预期的结果。2.2 盘一下 cd 的特殊符号全家桶cd 真正强大的地方在于它支持一堆特殊符号用好了效率翻倍。我把最常用的整理如下符号含义示例~当前用户的家目录cd ~直接回到家目录~用户名指定用户的家目录cd ~postgres到 postgres 用户的家目录.当前目录cd .没实际意义但可以用于“强制刷新”某些工具状态..上一级目录cd ..返回上级-上一次所在的目录cd -在两个目录之间反复横跳/根目录cd /直接到根重点说一下~和-。~是家目录的快捷方式。如果你当前登录用户是 root那cd ~等价于cd /root如果是普通用户 zhangsan那就等价于cd /home/zhangsan。比起愣愣地敲出一长串绝对路径~明显更简洁。cd -是我个人最依赖的技巧之一。比如你在/var/log/nginx看了半天日志突然要回/home/zhangsan/projects/website改配置改完又想看日志这时候不需要再敲一长串路径直接cd -就能回到上一次的目录再cd -又切回来。这个“上一次的目录”是由 shell 维护的相当于记了一个“历史位置”的快捷键。2.3 没有参数时cd 到底要去哪如果只敲一个 cd不加任何参数shell 默认会把当前目录切换到当前用户的家目录。等价于cd ~。这个行为在新手看来可能有点莫名“我明明没让它去任何地方它怎么自己跑了”其实这是 POSIX 标准里的默认约定无参数 cd 回到当前用户的家目录。在写脚本时如果你希望无论调用者从哪里执行都把工作目录先落在一个确定的位置可以在脚本开头直接写cd或者cd ~。这个小习惯能避免很多路径上的不确定性。2.4 脚本和自动化里的 cd 技巧真实工作中cd 很少单独一条出现更多的是出现在脚本或 CI/CD 流水线里。这就要注意 shell 的每个命令其实都在“子进程”或者“当前进程”里执行的问题。一条很容易踩的坑是在 shell 脚本里写cd /some/dir脚本执行完你在终端里的当前目录并不会变。因为脚本是在一个子 shell 里执行的子 shell 的 cd 影响不到父 shell。如果你希望脚本里的目录切换能影响到当前终端可以用source script.sh的方式执行脚本。另外一个技巧是把 cd 和函数封装起来。比如我经常在~/.bashrc里写几个便捷函数function proj() { cd ~/projects/$1 || return }这样我在终端里敲proj website就能直接切到~/projects/website。省去了一长串路径重复输入的痛苦。这些都是 cd 的“进阶玩法”实用性极高。3. 相对路径与绝对路径从本质上吃透它们3.1 绝对路径从根目录开始描述“全地址”绝对路径是从根目录/开始一路写到目标文件或目录的完整路径。它不依赖当前所在位置在任何地方都能准确找到目标。比如/etc/nginx/nginx.conf /home/zhangsan/projects/website/index.html你可以把它理解成“完整地址”省、市、区、街道、门牌号一步不少。只要按这个地址走一定找得到。绝对路径的优势是确定性极强。在系统服务、定时任务、Docker 挂载配置中但凡涉及路径我都建议写绝对路径。为什么因为这类场景的执行环境和人交互的终端不一样当前目录可能完全不是你预想的位置。比如 cron 任务执行脚本时它的 HOME、当前目录环境变量都可能是默认值这时候你写相对路径几乎必错。3.2 相对路径用“从我现在的位置怎么看”的方式描述相对路径则是以当前工作目录为基准来计算目标位置。它不开头带/常用的形式有# 直接进入当前目录下的子目录 cd website # 返回上一级 cd .. # 上一级的上一级 cd ../.. # 先到上一级再切到兄弟目录 cd ../config相对路径非常直观特别适合在目录结构比较深、又不想敲一长串绝对路径的时候使用。比如你已经在/home/zhangsan/projects/website下面想进入src/components直接cd src/components干净利落。但它的劣势也很明显结果依赖当前位置。如果你脚本里写了cd scripts但脚本被别的目录下的调用者执行了这个相对路径指向的就不是你预期的位置了。3.3 用生活化比喻拆解两者区别我用一个场景帮很多零基础朋友理解过把整个文件系统当成一栋办公楼。绝对路径就是“从大楼门口开始走到 301 室”/home/user/docs/report.pdf一辈子都不迷路。相对路径就是“从当前所在的 205 室往右走几步到 207 室”../207省事但如果你不在 205 室那这个描述就失效了。这个类比虽然简单但真的能解决“什么时候该用哪个”的纠结。原则上写给别人看的、写在配置里的、写进定时任务里的 → 用绝对路径自己临时敲命令、在已知目录结构里快速游走 → 用相对路径3.4 路径解析的内部逻辑这里补充一个稍微底层一点的点。当你敲下cd /home/zhangsan/projects/website时shell 是怎么找到它的其实 shell 只是把这个字符串转换成系统调用chdir()交给内核内核会根据路径名一层层解析目录项。在绝对路径下内核从根目录 inode 开始依次查找home、zhangsan、projects、website这些目录项最终得到目标目录的 inode。如果是相对路径内核会从当前进程的pwd所指向的目录 inode 开始查找。所以“相对路径”的本质是“相对于进程当前工作目录的查找起点不同”。这个底层视角能解释很多现象比如某个路径不存在时报错信息是No such file or directory就是因为在内核逐层查找的过程中某一级的目录项没找到。4. 常见问题与避坑实录4.1 路径里带空格怎么办很多新手在 Linux 上创建了带空格的目录然后 cd 的时候直接报错。比如cd My Documentsshell 会把它当成两个参数然后一脸懵。解决办法有两种# 用反斜杠转义空格 cd My\ Documents # 用双引号包住整个路径 cd My Documents我建议在路径包一层双引号可读性更好。如果是变量拼接路径更要在变量外包引号避免因为空格导致变量被拆成多个字段。比如target_dir/home/zhangsan/My Documents cd $target_dir4.2 报错 No such file or directory但目录明明存在这通常是当前目录和你预想的不一样。你敲cd project报错很可能你现在根本不在预期位置。先用pwd看一下当前位置再用ls或find确认目标到底在哪。我也遇到过因为前后多了空格比如cd project我连续敲了两个空格导致路径不对这类细节问题都能靠 pwd 和 ls 快速定位。4.3 cd - 和 cd .. 总有人搞混cd ..是回到当前目录的上一级cd -是回到“上一次所在目录”。两者完全是两个逻辑。举例来说你在/home/zhangsan敲cd /var/log现在在/var/log此时cd ..会去/var而cd -会回/home/zhangsan。4.4 脚本里的 cd 没有“生效”前面提到过脚本默认在子 shell 里运行所以你在脚本里 cd脚本执行完终端的目录不会变。如果确实需要脚本影响当前终端用source执行。另外在脚本里用 cd 之前强烈建议先判断目标目录是否存在if [ -d /some/path ]; then cd /some/path || exit 1 else echo 目录不存在 exit 1 fi这种防御性写法能避免在目录不存在时继续执行后续操作把风险扼杀在早期。4.5 常见问题速查表问题现象大概率原因解决办法cd 后提示 No such file or directory路径写错或当前位置和预期不一致用 pwd 确认当前位置ls 查看实际目录名称路径里有空格cd 报错没转义或没加引号用反斜杠转义或双引号包裹cd 之后目录没变化可能 cd 失败或你敲到了不同 shell检查是否有拼写错误确认命令是否有输出脚本里 cd 后终端目录不变子 shell 隔离用 source 执行脚本cd - 和 cd .. 结果和预期不符混淆了两个概念记住-是上一次目录..是上一级目录5. 从面试题到实战cd 与路径的高频考点5.1 面试官最爱的三个相关问题Linux 基础面试里cd 和路径相关的题出现频率相当高。我整理几个典型问题你们可以自测一下“绝对路径和相对路径的区别是什么”标准答法是绝对路径从根/开始不依赖环境相对路径从当前目录开始依赖当前所在位置。进一步可以提内核解析路径的机制。“请用一条命令回到上一次所在的目录”答案就是cd -。“在 shell 脚本中cd 会不会影响父进程的当前目录为什么”答案是“不会”因为脚本通常运行在子 shell 中。面试不只是考记性更考你有没有真正理解机制。把本章前面讲到的“当前工作目录”“子 shell”“路径解析”串起来面试官一问就能明显感觉到你是背的还是吃透了。5.2 实战中我建议你刻意练习的三个习惯第一在终端里随时用 pwd 确认当前位置。很多人只敲 ls从不 pwd结果在多层目录中迷失。养成“pwd - ls - cd”三步走的习惯可以少踩很多坑。第二在重要命令和脚本里用绝对路径。尤其是部署脚本、cron 任务、systemd service 的 ExecStart 配置一律绝对路径。这里的“重要”标准是只要这条命令不是给你一个人临时用的就要假设调用者的工作目录不可控。第三熟练使用 Tab 键补全。Linux 的 bash 和 zsh 都有强大的 Tab 补全敲目录名时只敲前几个字符然后按 Tab让 shell 自动补全。这既能提高速度又能规避手输路径容易发生的拼写错误。你多按几次 Tab如果补不出来说明目标路径根本不存在这本身就是一种校验机制。6. 写在最后的一点点个人经验关于 cd 和路径我最后再说一个自己踩过很多次之后才改掉的坏习惯以前我总喜欢在交互终端里用相对路径因为敲起来快但一旦把命令粘贴到脚本、或者改写成自动化任务时就忘了把路径改成绝对的结果半夜跑批任务报错爬起来查半天才发现是工作目录的问题。现在我执行任何“可能要复用”的命令时会先在心里问自己一句“这条命令如果换个环境跑还能不能找到它要找的东西”如果答案不确定那就直接写成绝对路径。这种思维方式的转变比单纯记住几条命令重要得多。希望这篇内容也能帮你把路径这件事从“会用”变成“懂为什么”以后无论遇到多深的目录、多复杂的自动化任务都能稳得住。