cd是shell内置命令,不能用绝对路径调用;路径错误、权限不足、空格未转义等环境细节会导致“no such file or directory”或“permission denied”。

直接说结论:cd 是 Shell 内置命令,不能用 /usr/bin/cd 调用,路径写错、权限不足、空格未转义,都会导致“No such file or directory”或“Permission denied”——不是命令不会用,而是环境细节没对上。
cd .. 和 cd ../.. 的实际行为差异
这两个命令看起来只是多一个 ..,但实际影响的是路径解析层级,不是“返回几次”。cd .. 总是跳到当前目录的父目录;cd ../.. 是先解析第一个 .. 得到父目录,再在这个父目录里找它的父目录。如果当前在 /home/user,cd .. 进 /home,cd ../.. 就进 /。但若当前在 /(根目录),cd .. 仍停留在 /,因为根目录没有父目录。
常见错误现象:
- 执行
cd ../..后发现没动,其实是卡在了根目录 - 路径中混用
..和绝对路径(如cd /var/log/../tmp)时,Shell 会先做路径规整再切换,结果可能和预期不同
含空格或中文路径必须加引号或转义
Linux 文件系统本身支持空格和中文,但 Shell 在分词时会把空格当参数分隔符。不处理就等于传了多个参数给 cd,而它只接受一个路径参数。
正确做法:
-
cd "My Documents"—— 双引号包裹,推荐 -
cd My\ Documents—— 反斜杠转义空格,注意每个空格前都要加 -
cd $HOME/桌面—— 中文目录名可直接用,前提是终端编码和文件系统一致(UTF-8)
容易踩的坑:用单引号 'My Documents' 虽然也能工作,但会禁用变量展开(比如 '$HOME' 不会被替换成路径)。
cd - 切换上一目录的限制条件
cd - 看似智能,其实只记最近一次成功切换的目录,且仅限于当前 Shell 进程生命周期内。它不跨终端、不跨 SSH 会话、不保存历史。
使用场景:
- 在
/var/log查日志,临时切到/etc/nginx改配置,再cd -回日志目录 - 配合
pushd/popd做多层目录跳转时,cd -只管最上一层
性能影响:无。它是 Shell 内置行为,不涉及磁盘或系统调用,纯内存操作。
为什么 cd ~root 或 cd ~nobody 有时失败
~username 语法依赖 getpwnam() 系统调用查用户主目录,但并非所有用户名都对应有效登录用户。比如 nobody 用户通常没有家目录,~nobody 展开后可能是空或非法路径,导致 cd 报错。
验证方式:
-
getent passwd nobody—— 看是否存在且字段完整 -
echo ~nobody—— 直接看波浪线展开结果
安全提示:普通用户默认无法进入 /root,即使 cd ~root 语法合法,也会因权限被拒。这不是 cd 的问题,而是目录执行位(x 权限)缺失。
真正难调试的,往往不是 cd /xxx 找不到路径,而是你忘了当前 Shell 是从哪启动的、$CDPATH 是否被设过、或者那个“看似存在的目录”其实是个没挂载的 NFS 路径——这些都不会报路径错,而是卡住或静默失败。










