跳转到内容

cd

cd(change directory)用于切换当前工作目录。它是 shell 内建命令,不是磁盘上的可执行文件。

Terminal window
cd [选项] [目录]

不带参数时回到 $HOME 目录可以是绝对路径(以 / 开头)或相对路径(相对当前目录)

参数 含义
不写 回到 $HOME
~ 同上;~user 是 user 的家目录
- 回到上一个工作目录($OLDPWD),并打印切换后的路径
.. 上一级目录
. 当前目录,等于什么都没做
/ 根目录

工作目录是进程自身的属性,子进程只能改自己的,改不了父进程的。假如 cd 是个外部程序,shell 执行它时会先 fork 出子进程,子进程切完目录就退出了,shell 自己待的位置纹丝不动。

所以 cd 只能由 shell 亲自执行。这也是 which cd 什么都查不到的原因 —— 它压根不是一个文件:

Terminal window
type cd

输出:

cd is a shell builtin
选项 说明
-L 按逻辑路径切换(logical),路径里的软链接原样保留,默认行为
-P 按物理路径切换(physical),先把软链接解析成真实路径再切

1. 在两个目录之间来回跳

Terminal window
cd /var/log
cd /etc/nginx
cd - # 回到 /var/log
cd - # 又回到 /etc/nginx

- 只记得住一层,跳第三个地方之前的位置就丢了 需要压栈式地来回切,用 pushd / popd

2. 软链接目录:-L 与 -P 的区别

当前在 /home/bdathe,建一个指向别处的软链接:

Terminal window
ln -s /var/log/nginx weblog

默认的 -L 停在链接路径上,.. 也按链接路径往回走:

/home/bdathe/weblog
cd weblog && pwd
cd .. && pwd
# /home/bdathe

-P 先解析成真实路径,.. 跟着走到真实路径的上一级:

/var/log/nginx
cd -P weblog && pwd
cd .. && pwd
# /var/log

同一条 cd ..,两种模式落到完全不同的地方,脚本里踩这个坑最多

3. 脚本里切到脚本自己所在的目录

Terminal window
cd "$(dirname "$0")" || exit 1

cd 会失败(目录不存在、没有执行权限),失败后面的命令就在错误的目录里跑起来了 脚本里的 cd 一律带上 || exit