# 目录堆栈

网道（WangDoc.com），互联网文档计划

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

## cd - #

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

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

    # 重新回到 /path/to/foo
    $ cd -

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

## pushd，popd #

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

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

    $ pushd dirname

上面命令会进入目录`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）-n 参数

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

    $ popd -n

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

（2）整数参数

这两个命令还可以接受一个整数作为参数，该整数表示堆栈中指定位置的记录（从0开始）。`pushd`命令会把这条记录移动到栈顶，同时切换到该目录；`popd`则从堆栈中删除这条记录，不会切换目录。

    # 将从栈顶算起的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`是删除倒数第二个。

（3）目录参数

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

    $ pushd dir

`popd`没有这个参数。

## dirs 命令 #

`dirs`命令可以显示目录堆栈的内容，一般用来查看`pushd`和`popd`操作后的结果。

    $ dirs
    ~/foo/bar ~/foo ~

该命令会输出一行文本，列出目录堆栈，目录之间使用空格分隔。栈顶（最晚入栈的目录）在最左边，栈底（最早入栈的目录）在最右边。

它有以下参数。

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

本教程采用知识共享 署名-相同方式共享 3.0协议。

分享本文