1. 命令作用
切换当前shell的工作目录。
2. 命令格式
1 | cd [-L] [-P [-e]] [dir] |
3. 命令解释
3.1. 特殊参数
cd命令后面一般跟一个目录的路径,可以使用绝对路径或者相对路径。如果不提供目录参数,那么默认$HOME,会被使用,即切换到用户的家目录。如果目录参参数是-,那么-会被替换为$OLDPWD,表示切换到上一次shell的工作目录。
如果你在dir后面提供了多余的参数,那么会被忽略,比如你执行
1 | cd /root foo bar |
foo bar会被忽略。(经过测试,某些版本的shell会打印出错误消息,例如:“bash: cd: too many arguments”)
如果一个文件夹的名称叫做“-”,那么使用cd -是不能切换进去的,可以使用cd ./- 实现。
3.2. CDPATH
如果环境变量CDPATH不为空,当我们直接输入cd dir的时候,如果dir在CDPATH中的某个目录中的时候,cd命令就会直接切换到这个目录。
例如:
1 | zk@zk:~$ pwd |
/home/zk目录下有Tools,Projects等目录,当把CDPATH设置成/home/zk的时候,此时直接输入cd Tools的时候,cd发现Tools在/home/zk中,那么就会之际切换到/home/zk/Tools中。
CDPATH中可以设置不止一个路径,多个路径使用:(冒号)分隔。
如该cd dir中dir是一个绝对路径,那么CDPATH将被禁用。如该CDPATH中的目录或者-参数指定的目录被成功切换,那么这个目录的绝对路径会被打印到标准输出。
3.3 $_的使用
$_指的是上一个命令的最后一个参数,利用这个我们可以使用一条命令,新建一个目录的同时,并cd进入这个目录。
1 | mkdir aa && cd $_ |
或者
1 | mkdir aa ; cd $_ |
4. 选项
4.1. -L选项
这是个默认的选项,使用这个选项的时候,当cd dir的时候,如果dir是符号链接的话,cd会切换到符号链接,而不是符号链接指向的目录。例如,
1 | zk@zk:~$ ls -lh |
在/home/zk目录下,有一个usrlocalbin目录,它是一个指向/usr/local/bin的符号链接,cd到这个目录以后,发现当前工作目录在/home/zk/usrlocalbin,而不是在/usr/local/bin。
如果cd dir中的dir包含..(父目录)和符号链接,那么-L选项会使得先处理..,再处理符号链接。例如
1 | cd /home/zk/usrlocalbin/../Tools |
这个命令会使得切换到/home/zk/Tools,可见在符号链接usrlocalbin展开之前,已经处理了..
4.2. -P选项
这个选项和-L选项刚好相反,他会在切换到符号链接的时候,真正进入符号链接所指向的目录,并且如果..和符号链接同时出现在目录路径中的时候,会先展开符号链接,再处理..,例如:
1 | zk@zk:~$ pwd ; ls -lh |
可见cd到usrlocalbin的时候,shell的工作目录进入了usrlocalbin指向真实目录/usr/local/bin,当我们使用cd -P /home/zk/usrlocalbin/../Tools/的时候,由于使用了-P选项,usrlocalbin会在解析..之前被展开,由于/usr/local/bin目录的上一级目录中没有Tools目录,因此就会报错。
4.3. -e选项
这个选项和-P选项一起使用,暂时不清楚作用是啥。