1. 别小看这个两字母命令cd 到底在干什么刚接触 Linux 那会儿我觉得cd这命令简单到不值一提——不就是切换目录嘛能有什么花样结果第一次上生产服务器排查问题cd /home和cd ~傻傻分不清切错了目录差点在错误的路径下执行了删除操作。从那以后我才明白越是基础的东西越容易在关键时刻坑人。cd是change directory的缩写属于 shell 的内置命令builtin不是独立的二进制程序。这一点很关键你用type cd查一下会发现它显示的是cd is a shell builtin而不是某个/bin/cd的路径。正因为它是内置的所以它的行为会受当前 shell 环境影响比如CDPATH变量、符号链接的处理方式、以及cd命令本身的别名设置都会让同一个命令在不同环境下表现不一样。这篇文章我打算把cd、cd ~、cd /、cd ..、cd /home这几个最常见也最容易混淆的用法彻底讲透。不管你是刚装好 Linux 虚拟机的新手还是天天泡在服务器上的运维看完之后至少能保证一件事再也不会因为切错目录而手抖。我会从底层原理讲到实操细节再把我这些年踩过的坑和排查技巧一并倒出来你可以直接拿去对照自己的环境验证。2. 五种 cd 写法逐个拆解从原理到实际行为2.1 cd 不带参数回到用户主目录的默认行为很多人以为cd不带参数是什么都不做其实恰恰相反它会把你送到当前用户的主目录home directory。这个行为等价于cd ~也等价于cd $HOME。为什么会有这个设计因为主目录是用户登录后的默认落脚点日常操作里回家是高频动作所以 shell 干脆让cd空参就完成这件事。你可以这样验证# 先随便切到一个目录 cd /tmp pwd # 输出/tmp # 然后不带参数执行 cd cd pwd # 输出/home/你的用户名这里有个细节值得注意cd空参依赖的是HOME环境变量。如果你用sudo或者在某些特殊上下文里执行HOME可能被改成了/root或者干脆为空。我遇到过一种情况在脚本里用sudo -u someuser切换用户后执行cd结果因为HOME没跟着切换直接回到了 root 的家目录后续的文件操作全跑偏了。所以在脚本里永远不要依赖裸cd要写就写cd $HOME或者明确的绝对路径。提示用echo $HOME确认当前 shell 认为你的家在哪尤其是在切换用户、使用 sudo、或者通过某些自动化工具执行命令时这一步能帮你避开大量路径错误。2.2 cd ~波浪号背后的展开机制~这个符号在 shell 里叫tilde expansion波浪号展开它由 shell 在命令执行前就替换掉了cd命令本身根本看不到~。也就是说你敲cd ~shell 先把它变成cd /home/你的用户名然后才交给cd执行。这个展开规则有几个变体很多人只知道第一个写法展开结果说明~$HOME当前用户主目录~username指定用户的主目录比如~root展开为/root~/docs$HOME/docs家目录下的子路径~$PWD当前工作目录~-$OLDPWD上一个工作目录~-这个用法特别实用。比如你在/etc/nginx和/var/log/nginx之间来回切换直接cd ~-就能跳回上一个目录比敲cd -还直观其实cd -也是同样的效果但~-可以嵌在更长的路径里比如cd ~-/conf.d。有个坑我必须提醒~的展开只在 shell 层面生效。如果你把~写在引号里比如cd ~/docsshell 就不会展开它cd会去找一个名字真的叫~的目录结果当然是报错No such file or directory。同理在脚本里用变量拼接路径时也要小心cd $DIR/~这种写法是不会展开的。2.3 cd /根目录不是全部别搞混cd /就是切到文件系统的根目录。这里要澄清一个新手常见的误解根目录/不是所有文件的总和它是整个目录树的起点所有其他路径都是从它往下延伸的。你可以用ls /看看根目录下有什么典型的结构包括/bin、/sbin基础命令/etc配置文件/home普通用户主目录/rootroot 用户主目录/var可变数据比如日志/tmp临时文件/usr用户程序和数据/proc、/sys内核暴露的虚拟文件系统为什么很多人会把cd /和cd ~搞混因为 Windows 里没有根目录和用户目录这种清晰的分层概念C 盘既是系统盘又是用户数据盘。到了 Linux/是系统级起点~是用户级起点两者完全不是一回事。我在带新人的时候最常纠正的就是这个你要找自己的文件去~你要找系统配置去/etc/只是路过的地方别在那待着。还有一个细节普通用户对/通常只有读和执行权限没有写权限。你cd /之后想touch test.txt会直接报Permission denied。这不是 bug是设计如此。2.4 cd ..向上跳一级以及那些容易翻车的边界..代表父目录parent directorycd ..就是往上走一层。这个用法看似简单但边界情况特别多。先看基本行为cd /home/user/docs pwd # /home/user/docs cd .. pwd # /home/user连续向上可以用cd ../..跳两级。但这里有个反直觉的点在根目录执行cd ..不会报错也不会去更上层而是原地不动。因为/的父目录就是它自己。你可以试试cd / cd .. pwd # 还是 /这个特性在脚本里是把双刃剑。好处是循环向上找文件时不会因为到顶而崩掉坏处是如果你写了个while循环靠cd ..往上爬到根目录后会陷入死循环。我见过一个备份脚本就是这么写的跑到根目录后一直空转把 CPU 占满了。另一个坑是符号链接。假设/home/user/link是一个指向/data/project的软链接你cd /home/user/link进去后pwd显示的是/home/user/link逻辑路径但cd ..会把你带到/home/user还是/data答案是取决于 shell 的-P和-L选项默认行为下cd ..走的是逻辑路径回到/home/user。如果你想要物理路径行为得用cd -P ..。这个差异在部署脚本里经常引发文件明明在怎么找不到的诡异问题。注意涉及软链接目录时先用pwd -P看看物理路径到底是什么再决定用cd ..还是cd -P ..能省下大量排查时间。2.5 cd /home绝对路径的确定性优势cd /home用的是绝对路径从根目录开始一路写全。它的最大价值就是确定性——不管你现在在哪执行完一定在/home。对比一下相对路径cd home如果你当前在/它会去/home如果你在/etc它会去找/etc/home大概率报错。所以我在写脚本、写文档、给别人指路的时候一律用绝对路径。相对路径只适合交互式操作里图省事。/home这个目录本身也值得说两句。在大多数发行版里它是所有普通用户主目录的父目录结构通常是/home/用户名/。但注意root 用户的主目录不在/home下而是/root。这是历史遗留设计早期是为了让 root 在/home挂载失败时也能登录。所以cd /home之后你ls是看不到 root 的家目录的。另外有些服务器会把/home单独挂载到一个大容量分区甚至用网络存储。这时候cd /home可能会因为挂载点没就绪而卡住或者进到空目录。判断方法很简单df -h /home mount | grep home如果df显示的是独立设备说明/home是单独挂载的操作前最好确认挂载状态。3. 实操验证把五种写法跑一遍并观察差异3.1 搭建一个干净的验证环境光看理论容易记混我建议你跟着下面这套流程亲手跑一遍。准备一台 Linux 环境虚拟机、云主机、WSL 都行我用的是 Ubuntu 22.04其他发行版行为基本一致。先建一个测试用的目录结构方便观察mkdir -p /tmp/cdtest/a/b/c cd /tmp/cdtest/a/b/c pwd现在你在最深层/tmp/cdtest/a/b/c接下来我们逐个验证。3.2 逐条执行并记录 pwd 输出按顺序执行下面这组命令每条后面跟一个pwd把结果记下来# 测试 1cd .. cd .. pwd # 预期/tmp/cdtest/a/b # 测试 2连续向上 cd ../.. pwd # 预期/tmp # 测试 3cd / cd / pwd # 预期/ # 测试 4cd /home cd /home pwd # 预期/home # 测试 5cd ~ cd ~ pwd # 预期/home/你的用户名 # 测试 6cd 空参 cd /tmp cd pwd # 预期/home/你的用户名跑完这六条你应该能直观感受到cd ..是相对的、依赖当前位置cd /和cd /home是绝对的、结果固定cd ~和裸cd都指向家目录。3.3 用 cd - 和 ~- 提升切换效率再补两个提效技巧。cd -会在当前目录和上一个目录之间来回跳cd /etc cd /var/log cd - pwd # 预期/etc cd - pwd # 预期/var/log这个在改配置—看日志—改配置的循环里特别好用。~-效果一样但能嵌进路径cd /etc/nginx cd /var/log/nginx cd ~-/conf.d pwd # 预期/etc/nginx/conf.d3.4 观察 CDPATH 对 cd 的隐藏影响有个变量叫CDPATH它会改变cd查找相对路径的行为。默认是空的但如果你在.bashrc里设了它cd就会先去CDPATH列出的目录里找export CDPATH/tmp/cdtest cd a pwd # 如果 CDPATH 生效会跳到 /tmp/cdtest/a这个特性在交互式使用里能省事但在脚本里是灾难——因为脚本期望的相对路径行为被悄悄改掉了。所以脚本开头最好unset CDPATH或者用绝对路径。我踩过一次坑本地测试好好的脚本上了服务器就找不到目录查了半天才发现是运维在全局 profile 里设了CDPATH。4. 常见问题与排查技巧实录4.1 报错信息速查表下面这张表是我这些年遇到最多的cd相关报错按出现频率排序报错信息常见原因解决思路No such file or directory路径不存在或~被引号包住没展开用ls确认路径去掉引号Not a directory目标是个文件不是目录ls -l看类型Permission denied没有该目录的执行权限ls -ld看权限位检查 x 位Too many levels of symbolic links软链接成环ls -l追链接用-P绕过cd: OLDPWD not set首次登录就cd -先正常cd一次4.2 权限问题为什么我能看到目录却进不去Linux 目录的权限里执行位 x 决定能不能进入读位 r 决定能不能列出内容。这俩是分开的。所以会出现我能ls看到这个目录名但cd进去就 Permission denied的情况——因为父目录有 r 没 x。# 复现 mkdir /tmp/nox chmod 644 /tmp/nox cd /tmp/nox # 报错Permission denied解决就是给执行位chmod x /tmp/nox。这个知识点在排查服务启动失败、配置文件读不到时特别有用因为很多时候不是文件权限问题而是路径上某一级目录缺 x 位。4.3 软链接目录下的 cd .. 陷阱前面提过这里展开说。假设mkdir -p /data/real ln -s /data/real /tmp/link cd /tmp/link pwd # /tmp/link cd .. pwd # /tmp默认cd ..回到了/tmp而不是/data。如果你期望的是物理路径行为得这样cd -P /tmp/link pwd # /data/real cd .. pwd # /data判断当前 shell 用的是哪种模式看pwd输出和pwd -P是否一致即可。部署脚本里如果涉及软链接目录我强烈建议统一用cd -P避免逻辑路径带来的歧义。4.4 脚本里 cd 失败的静默陷阱这是最阴险的一类问题。看这段脚本cd /nonexistent/path rm -rf *如果cd失败了脚本不会停rm -rf *会在当前目录执行。要是当前目录恰好是/或者某个重要目录后果不堪设想。正确写法是cd /nonexistent/path || exit 1 rm -rf ./*或者更严格set -e cd /nonexistent/path rm -rf ./*set -e让脚本在任何命令失败时立即退出。我现在的习惯是任何脚本开头都写set -euo pipefail这三个选项能挡掉绝大多数静默失败。另外rm -rf *最好写成rm -rf ./*多一个点能避免某些极端情况下*展开异常。提示涉及删除、覆盖的脚本cd后面一定要跟|| exit并且删除目标尽量用绝对路径或先pwd确认。这个习惯帮我躲过了至少两次生产事故。4.5 切换用户后 cd 行为异常用su或sudo -i切换用户时HOME变量的更新时机和方式不一样。su - username带横杠会完整加载目标用户的登录环境HOME正确su username不带横杠则保留原环境HOME可能还是旧用户的。这时候裸cd就会去错地方。排查方法whoami echo $HOME cd pwd三个输出对不上就是环境变量没切干净。解决就是养成用su -或sudo -i的习惯或者在命令里显式指定HOME/home/target。5. 把这些细节变成肌肉记忆5.1 我的日常使用习惯清单用了这么多年我总结出一套自己的cd使用原则分享给你交互式操作优先用cd -和~-提效少敲长路径写脚本一律绝对路径开头set -euo pipefailcd后跟|| exit涉及软链接先pwd -P确认物理路径必要时cd -P切换用户用su -或sudo -i切完先echo $HOME确认删除操作前先pwd再动手rm目标写./前缀这些不是死规矩但每一条背后都有我踩过的坑。你可以根据自己的环境调整核心思路就一个让路径行为可预测。5.2 给新手的三个练习建议如果你刚开始学 Linux我建议这样练第一把/tmp/cdtest那套目录结构建出来把本文所有命令亲手跑一遍别只看。第二故意制造几个错误——比如cd一个不存在的目录、cd一个没权限的目录、在软链接里cd ..观察报错和实际行为。第三写一个五行的脚本故意让cd失败看看不加|| exit会发生什么加深印象。cd这个命令敲一万遍都不嫌多。真正拉开差距的不是你知道它怎么用而是你知道它在什么情况下会不按你想的来。把这五种写法的边界都摸清楚你在 Linux 上的每一步都会走得更稳。
企业数字化 ERP 产品动态
相关推荐
医院预约挂号系统毕设:Spring Boot与微信小程序的号源并发设计 1. 医院预约挂号系统:毕设题目背后真正要解决的问题1.1 为什么这个题目每年都有人选,却每年都有人做砸医院预约挂号系统,几乎每个计算机专业的毕业设计选题列表里都有。原因很简单:技术上不超前,但麻雀虽小五脏俱全&am… · 2026/9/26 18:30:07
Vue3 项目配置 eslint+prettier:用 TaoToken 统一 AI 补全与格式化链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 18:30:07
Python直链解析实战:突破网盘限速的下载方案 1. 直链解析到底在解决什么问题很多人第一次接触"直链解析"这个词,是因为被网盘的下载速度折磨得没脾气。明明家里是千兆宽带,下载一个几百兆的文件,进度条却像蜗牛爬树,几十KB每秒的速度能磨掉一整个下午。这时候就会有… · 2026/9/26 19:39:01
从MyBatis缓存到Redis二级缓存:数据库性能优化实践 1. 从一次线上故障说起:缓存优化到底解的是什么问题半年前我们团队接手了一个订单查询系统的性能治理,现象很典型:数据库CPU持续高位,高峰期查询接口的平均响应时间在800ms以上,部分复杂报表查询直接能把连接池打满。当… · 2026/9/26 19:38:55
蒙特卡洛积分:光线追踪降噪与采样策略的核心数学 1. 从一个全是噪点的渲染图说起我最早接触光线追踪时,第一反应是:这东西怎么这么慢?关掉一个看似平平无奇的场景,在1080p分辨率下跑一帧,动辄就是几分钟甚至几十分钟。更让人抓狂的是,好不容易算完… · 2026/9/26 19:38:55
生产LLM全链路管控:TaoToken统一Key下Token、成本、延迟三位一体优化落地 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:38:48
pnpm 忽略构建脚本报错解析与解决方案 1. 这个报错到底在说什么第一次看到[ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: parcel/watcher2.5.6, canvas2.11.2这行红字,很多人第一反应是“我是不是装崩了”,然后开始疯狂重装、删node_modules、删 lock 文件,折腾半天发现报错还… · 2026/9/26 19:38:35
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46