cd
2022-09-19 14:53:52 # 操作系统 # Linux # shell # 常用命令 # shell内建命令

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
2
3
4
5
6
7
8
9
10
zk@zk:~$ pwd
/home/zk
zk@zk:~$ ls
Desktop Downloads Pictures Public Tools Videos
Documents Music Projects Templates usrlocalbin
zk@zk:~$ CDPATH=/home/zk
zk@zk:~$ cd /
zk@zk:/$ cd Tools/
/home/zk/Tools
zk@zk:~/Tools$

/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
zk@zk:~$ ls -lh
total 40K
drwxr-xr-x 2 zk zk 4.0K Sep 17 15:02 Desktop
drwxr-xr-x 3 zk zk 4.0K Sep 16 13:29 Documents
drwxr-xr-x 4 zk zk 4.0K Sep 18 22:26 Downloads
drwxr-xr-x 2 zk zk 4.0K Sep 14 16:45 Music
drwxr-xr-x 2 zk zk 4.0K Sep 15 12:37 Pictures
drwxrwxr-x 6 zk zk 4.0K Sep 18 22:27 Projects
drwxr-xr-x 2 zk zk 4.0K Sep 14 16:45 Public
drwxr-xr-x 2 zk zk 4.0K Sep 14 16:45 Templates
drwxrwxr-x 3 zk zk 4.0K Sep 19 15:44 Tools
lrwxrwxrwx 1 zk zk 15 Sep 19 00:26 usrlocalbin -> /usr/local/bin/
drwxr-xr-x 2 zk zk 4.0K Sep 14 16:45 Videos
zk@zk:~$ cd usrlocalbin
/home/zk/usrlocalbin
zk@zk:~/usrlocalbin$ pwd
/home/zk/usrlocalbin
zk@zk:~/usrlocalbin$

在/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
zk@zk:~$ pwd ; ls -lh
/home/zk
total 40K
drwxr-xr-x 2 zk zk 4.0K Sep 17 15:02 Desktop
drwxr-xr-x 3 zk zk 4.0K Sep 16 13:29 Documents
drwxr-xr-x 4 zk zk 4.0K Sep 18 22:26 Downloads
drwxr-xr-x 2 zk zk 4.0K Sep 14 16:45 Music
drwxr-xr-x 2 zk zk 4.0K Sep 15 12:37 Pictures
drwxrwxr-x 6 zk zk 4.0K Sep 18 22:27 Projects
drwxr-xr-x 2 zk zk 4.0K Sep 14 16:45 Public
drwxr-xr-x 2 zk zk 4.0K Sep 14 16:45 Templates
drwxrwxr-x 3 zk zk 4.0K Sep 19 15:44 Tools
lrwxrwxrwx 1 zk zk 15 Sep 19 00:26 usrlocalbin -> /usr/local/bin/
drwxr-xr-x 2 zk zk 4.0K Sep 14 16:45 Videos
zk@zk:~$ cd -P usrlocalbin
zk@zk:/usr/local/bin$ cd
zk@zk:~$ cd /home/zk/usrlocalbin/../T
Templates/ Tools/
zk@zk:~$ cd -P /home/zk/usrlocalbin/../Tools/
bash: cd: /home/zk/usrlocalbin/../Tools/: No such file or directory
zk@zk:~$

可见cd到usrlocalbin的时候,shell的工作目录进入了usrlocalbin指向真实目录/usr/local/bin,当我们使用cd -P /home/zk/usrlocalbin/../Tools/的时候,由于使用了-P选项,usrlocalbin会在解析..之前被展开,由于/usr/local/bin目录的上一级目录中没有Tools目录,因此就会报错。

4.3. -e选项

这个选项和-P选项一起使用,暂时不清楚作用是啥。