cd
cd(change directory)用于切换当前工作目录。它是 shell 内建命令,不是磁盘上的可执行文件。
cd [选项] [目录]不带参数时回到
$HOME目录可以是绝对路径(以/开头)或相对路径(相对当前目录)
| 参数 | 含义 |
|---|---|
| 不写 | 回到 $HOME |
~ |
同上;~user 是 user 的家目录 |
- |
回到上一个工作目录($OLDPWD),并打印切换后的路径 |
.. |
上一级目录 |
. |
当前目录,等于什么都没做 |
/ |
根目录 |
工作目录是进程自身的属性,子进程只能改自己的,改不了父进程的。假如 cd 是个外部程序,shell 执行它时会先 fork 出子进程,子进程切完目录就退出了,shell 自己待的位置纹丝不动。
所以 cd 只能由 shell 亲自执行。这也是 which cd 什么都查不到的原因 —— 它压根不是一个文件:
type cd输出:
cd is a shell builtin| 选项 | 说明 |
|---|---|
-L |
按逻辑路径切换(logical),路径里的软链接原样保留,默认行为 |
-P |
按物理路径切换(physical),先把软链接解析成真实路径再切 |
1. 在两个目录之间来回跳
cd /var/logcd /etc/nginxcd - # 回到 /var/logcd - # 又回到 /etc/nginx
-只记得住一层,跳第三个地方之前的位置就丢了 需要压栈式地来回切,用pushd/popd
2. 软链接目录:-L 与 -P 的区别
当前在 /home/bdathe,建一个指向别处的软链接:
ln -s /var/log/nginx weblog默认的 -L 停在链接路径上,.. 也按链接路径往回走:
cd weblog && pwdcd .. && pwd# /home/bdathe-P 先解析成真实路径,.. 跟着走到真实路径的上一级:
cd -P weblog && pwdcd .. && pwd# /var/log同一条
cd ..,两种模式落到完全不同的地方,脚本里踩这个坑最多
3. 脚本里切到脚本自己所在的目录
cd "$(dirname "$0")" || exit 1
cd会失败(目录不存在、没有执行权限),失败后面的命令就在错误的目录里跑起来了 脚本里的cd一律带上|| exit
help cd(内建命令,man cd给的是 POSIX 通用说明,不是当前 shell 的实现)- Bash Reference Manual – Bourne Shell Builtins