警告
本文最后更新于 2023-10-22,文中内容可能已过时。
Bash 目录堆栈
为了方便用户在不同目录之间切换,Bash 提供了目录堆栈功能。
我们在使用命令行的时候,切换目录是一件很麻烦地事情,除非你事先记住了目标目录,否则一般都得一级一级地找过去,目录堆栈地出现帮助了我们记住目录,方便了用户在不同的目录之间切换。
cd -
Bash 可以记忆用户进入过的目录。默认情况下,只记忆前一次所在的目录,cd -
命令可以返回前一次的目录。也就是说,通过cd -
可以快速地在两个目录之间来回切换
1
2
3
4
5
6
7
8
9
|
$ cd /opt/SSL/
$ cd -
/opt/globbing
$ cd -
/opt/SSL
$ cd -
/opt/globbing
$ cd -
/opt/SSL
|
pushd 和 popd
如果希望记忆多重目录,然后再多重目录之间来回切换,可以使用pushd
命令和popd
命令。它们用来操作目录堆栈。
pushd
命令的用法类似cd
命令,可以进入指定的目录。第一次使用pushd
命令时,会将当前目录先放入堆栈,然后将所要进入的目录也放入堆栈,位置在前一个记录的上方,即新的栈顶。以后每次使用pushd
命令,都会将所要进入的目录,放在堆栈的顶部。这样,就形成了一个目录栈的结构,新的目录在栈顶,旧的目录在栈底。
popd
命令不带有参数时,会移除堆栈的顶部记录,并进入新的栈顶目录(即原来的第二条目录)。
pushd
命令和popd
保证了,任何时刻,当前目录就在目录堆栈的顶部。
注意,执行完pushd
和popd
之后,会将目录堆栈输出,先输出栈顶,再输出栈底
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
[root@iZbp1ag455gf8nrfdeqknwZ SSL]# pushd a
/opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ a]# pushd ../b
/opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ b]# pushd ../c
/opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ c]# pushd ../d
/opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ d]# pushd ../e
/opt/SSL/e /opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ e]# pushd ../f
/opt/SSL/f /opt/SSL/e /opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ f]# pushd ../g
/opt/SSL/g /opt/SSL/f /opt/SSL/e /opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ g]# pushd ../h
/opt/SSL/h /opt/SSL/g /opt/SSL/f /opt/SSL/e /opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ h]# popd
/opt/SSL/g /opt/SSL/f /opt/SSL/e /opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ g]# popd
/opt/SSL/f /opt/SSL/e /opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ f]# popd
/opt/SSL/e /opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ e]# popd
/opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ d]# popd
/opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ c]# popd
/opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ b]# popd
/opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ a]#
|
在使用pushd
命令和popd
命令的时候穿插使用cd
是没有关系的,因为使用cd
不影响目录堆栈
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@iZbp1ag455gf8nrfdeqknwZ a]# pushd ../b
/opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ b]# pushd ../c
/opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ c]# pushd ../d
/opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ d]# pushd ../e
/opt/SSL/e /opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ e]# cd /root
[root@iZbp1ag455gf8nrfdeqknwZ ~]# cd ~
[root@iZbp1ag455gf8nrfdeqknwZ ~]# popd
/opt/SSL/d /opt/SSL/c /opt/SSL/b /opt/SSL/a /opt/SSL
[root@iZbp1ag455gf8nrfdeqknwZ d]#
|
命令参数
- -n 参数
-n
的参数表示仅操作堆栈,不改变目录。
上面的命令仅删除堆栈顶部的记录,不改变目录,执行完成后还停留在当前目录。
- 整数参数
这两个命令还可以接受一个整数作为参数,该整数表示堆栈中指定位置的记录(从 0 开始)。pushd
命令会把这条记录移动到栈顶,同时切换到该目录;popd
则从堆栈中删除这条记录,不会切换目录。
1
2
3
4
5
6
7
8
9
10
11
|
# 将从栈顶算起的3号目录(从0开始)移动到栈顶,同时切换到该目录
$ pushd +3
# 将从栈底算起的3号目录(从0开始)移动到栈顶,同时切换到该目录
$ pushd -3
# 删除从栈顶算起的3号目录(从0开始),不改变当前目录
$ popd +3
# 删除从栈底算起的3号目录(从0开始),不改变当前目录
$ popd -3
|
上面例子的整数编号都是从 0 开始计算,popd +0
是删除第一个目录,popd +1
是删除第二个,popd -0
是删除最后一个目录,popd -1
是删除倒数第二个。
- 目录参数
pushd
可以接受一个目录作为参数,表示将该目录放到堆栈顶部,并进入该目录。
popd
没有这个参数。
dirs 命令
dirs
命令可以显示目录堆栈的内容,一般用来查看pushd
和popd
操作后的结果。其实pushd
和popd
命令本身也会输出目录堆栈。
1
2
|
$ dirs
~/foo/bar ~/foo ~
|
该命令会输出一行文本,列出目录堆栈,目录之间使用空格分隔。栈顶(最晚入栈的目录)在最左边,栈底(最早入栈的目录)在最右边。
它有以下参数。
-c
:清空目录栈。
-l
:用户主目录不显示波浪号前缀,而打印完整的目录。
-p
:每行一个条目打印目录栈,默认是打印在一行。
-v
:每行一个条目,每个条目之前显示位置编号(从 0 开始)。
+N
:N
为整数,表示显示堆顶算起的第 N 个目录,从零开始。
-N
:N
为整数,表示显示堆底算起的第 N 个目录,从零开始。
别名
其实方便期间,可以给pushd
和popd
起一个别名,比如cd -
叫cdp
,pushd
叫cdi
,popd
叫cdo
,这样,简短好记又直观
在/etc/bashrc
的最后添加别名
1
2
3
4
5
|
alias cdp='cd -'
alias cdi='pushd'
alias cdo='popd'
alias cda='dirs -l -p -v'
alias cdc='dirs -c'
|
然后启用配置即可。