目录堆栈

阮一峰 ... Linux
大约 3 分钟

为了方便用户在不同目录之间切换,Bash 提供了目录堆栈功能。

# cd -

Bash 可以记忆用户进入过的目录。默认情况下,只记忆前一次所在的目录,cd - 命令可以返回前一次的目录。

# 当前目录是 /path/to/foo
$ cd bar

# 重新回到 /path/to/foo
$ cd -
1
2
3
4
5

上面例子中,用户原来所在的目录是 /path/to/foo,进入子目录 bar 以后,使用 cd - 可以回到原来的目录。

# pushd,popd

如果希望记忆多重目录,可以使用 pushd 命令和 popd 命令。它们用来操作目录堆栈。

pushd 命令的用法类似 cd 命令,可以进入指定的目录。

pushd dirname
1

上面命令会进入目录 dirname,并将该目录放入堆栈。

第一次使用 pushd 命令时,会将当前目录先放入堆栈,然后将所要进入的目录也放入堆栈,位置在前一个记录的上方。以后每次使用 pushd 命令,都会将所要进入的目录,放在堆栈的顶部。

popd 命令不带有参数时,会移除堆栈的顶部记录,并进入新的堆栈顶部目录(即原来的第二条目录)。

下面是一个例子。

# 当前处在主目录,堆栈为空
$ pwd
/home/me

# 进入 /home/me/foo
# 当前堆栈为 /home/me/foo /home/me
$ pushd ~/foo

# 进入 /etc
# 当前堆栈为 /etc /home/me/foo /home/me
$ pushd /etc

# 进入 /home/me/foo
# 当前堆栈为 /home/me/foo /home/me
$ popd

# 进入 /home/me
# 当前堆栈为 /home/me
$ popd

# 目录不变,当前堆栈为空
$ popd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

这两个命令的参数如下。

  1. -n 参数

    -n 的参数表示仅操作堆栈,不改变目录。

    popd -n
    
    1

    上面的命令仅删除堆栈顶部的记录,不改变目录,执行完成后还停留在当前目录。

  2. 整数参数

    这两个命令还可以接受一个整数作为参数,该整数表示堆栈中指定位置的记录(从 0 开始),作为操作对象。这时不会切换目录。

    # 从栈顶算起的3号目录(从0开始),移动到栈顶
    $ pushd +3
    
    # 从栈底算起的3号目录(从0开始),移动到栈顶
    $ pushd -3
    
    # 删除从栈顶算起的3号目录(从0开始)
    $ popd +3
    
    # 删除从栈底算起的3号目录(从0开始)
    $ popd -3
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    上面例子的整数编号都是从 0 开始计算,popd +0 是删除第一个目录,popd +1 是删除第二个,popd -0 是删除最后一个目录,,popd -1 是删除倒数第二个。

  3. 目录参数

    pushd 可以接受一个目录作为参数,表示将该目录放到堆栈顶部,并进入该目录。

    pushd dir
    
    1

    popd 没有这个参数。

# dirs 命令

dirs 命令可以显示目录堆栈的内容,一般用来查看 pushdpopd 操作后的结果。

dirs
1

它有以下参数。

  • -c: 清空目录栈。
  • -l: 用户主目录不显示波浪号前缀,而打印完整的目录。
  • -p: 每行一个条目打印目录栈,默认是打印在一行。
  • -v: 每行一个条目,每个条目之前显示位置编号(从 0 开始)。
  • +N: N 为整数,表示显示堆顶算起的第 N 个目录,从零开始。
  • -N: N 为整数,表示显示堆底算起的第 N 个目录,从零开始。