55. dirs、pushd 和 popd


使用 dirspushdpopd 来操作 bash 目录堆栈。 您可以使用目录堆栈分别通过压入和弹出来保存和恢复当前工作目录。

  • dirs:显示目录堆栈
  • pushd:将目录推入堆栈
  • popd:从堆栈中弹出目录并 cd 到该目录

dirs将始终打印当前目录,然后打印堆栈的内容。 即使目录堆栈为空,dirs命令仍会打印当前目录。 请记住:~代表您的主目录。

$ popd
-bash: popd: directory stack empty

$ dirs
~

$ pwd
/home/ramesh

让我们首先创建一些临时目录。

mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
mkdir /tmp/dir4

将这些临时目录推入目录堆栈,如下所示。

cd /tmp/dir1
pushd .
cd /tmp/dir2
pushd .
cd /tmp/dir3
pushd .
cd /tmp/dir4
pushd .

将以上 4 个目录压入堆栈后,我们使用 dirs 命令查看目录堆栈的内容。

$ dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1

注意dirs 命令输出的第一个目录 (/tmp/dir4) 始终是当前目录,而不是堆栈中的内容。

现阶段,目录栈包含以下目录:

/tmp/dir4
/tmp/dir3
/tmp/dir2
/tmp/dir1

最后推送到堆栈的目录将位于顶部。 当您执行 popd 时,bash 将cd到堆栈中的顶部目录条目并将其从堆栈中删除。 如上所示,我们压入堆栈的最后一个目录是/tmp/dir4。 因此,当我们执行 popd 时,我们将切换到/tmp/dir4并将其从目录堆栈中删除,如下所示。

$ popd
$ pwd
/tmp/dir4

上述 popd 之后,目录堆栈包含以下目录:

/tmp/dir3
/tmp/dir2
/tmp/dir1

现在,执行 popd 从堆栈中弹出另一个目录并切换到它。

$ popd
$ pwd
/tmp/dir3

popd 之后,目录堆栈包含以下目录:

/tmp/dir2
/tmp/dir1

现在,执行另一个 popd 以从堆栈中弹出一个目录并切换到该目录。

$ popd
$ pwd
/tmp/dir2

现在,执行另一个 popd 以从堆栈中弹出一个目录并切换到该目录。

$ popd
$ pwd
/tmp/dir1

popd 之后,目录堆栈为空!

$ popd
-bash: popd: directory stack empty

默认情况下,dirs 命令在一行中打印目录堆栈的内容,如下所示。

$ dirs
~ /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1

使用 dirs -p 在单独的行中打印目录堆栈中的所有条目:

$ dirs -p
~
/tmp/dir4
/tmp/dir3
/tmp/dir2
/tmp/dir1

使用 dirs -l 显示每个条目的完整路径:

$ dirs -l
/home/ramesh/.ssh /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1

使用 dirs -c 删除目录堆栈上的所有条目。

$ dirs -c

使用 dirs -v 打印目录堆栈中的所有条目,每个条目及其在堆栈中的位置位于单独的行上:

$ dirs -v
 0 ~
 1 /tmp/dir4
 2 /tmp/dir3
 3 /tmp/dir2
 4 /tmp/dir1

使用 dirs +n 显示目录堆栈中的第 n 个元素。 例如,要显示第三个元素,请执行以下操作:

$ dirs +3
/tmp/dir2

使用 dirs -n 显示目录堆栈中的第 n 个元素(按相反顺序计数)。 例如,要显示从底部开始的第三个元素,请执行以下操作:

$ dirs -3
/tmp/dir4

注意:当 bash 从底部开始计数时,列表中的最后一个元素被视为第 0 个元素。

默认情况下,当您执行 pushd 命令时,除了将该目录放入目录堆栈之外,bash 还会对该目录执行 cd 操作。 使用pushd -n选项,您可以将目录添加到堆栈中,而无需切换到它。

将主目录推入堆栈,但不更改您的工作目录:

$ cd ~
$ pushd -n /etc/
$ pwd
/home/ramesh

您还可以将 +n-npushd 一起使用,分别向上或向下旋转目录堆栈。

让我们假设目录堆栈包含以下列表。

$ dirs -v
 0 /tmp/dir4
 1 /tmp/dir4
 2 /tmp/dir3
 3 /tmp/dir2
 4 /tmp/dir1

使用pushd +2,您可以向上旋转堆栈,使列表的第二个元素(/tmp/dir3)成为新的堆栈顶部,如下所示。

$ pushd +2
/tmp/dir3 /tmp/dir2 /tmp/dir1 /tmp/dir4 /tmp/dir4

$ dirs -v
 0 /tmp/dir3
 1 /tmp/dir2
 2 /tmp/dir1
 3 /tmp/dir4
 4 /tmp/dir4

使用pushd -2,您可以向下旋转堆栈,使列表末尾的第二个元素成为新的堆栈顶部。

默认情况下,当您执行 popd 命令时,bash 将从目录堆栈中选择顶部条目,cd 到该条目,然后从堆栈中删除该条目。

假设目录堆栈包含以下项目,当前目录是主目录。

$ pwd
/home/ramesh

$ dirs -v
 0 /tmp/dir4
 1 /tmp/dir4
 2 /tmp/dir3
 3 /tmp/dir2
 4 /tmp/dir1

使用 popd -n,您可以从堆栈中删除顶部条目,而无需切换到该目录。

$ popd -n
/tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1

$ dirs -v
 0 /tmp/dir4
 1 /tmp/dir3
 2 /tmp/dir2
 3 /tmp/dir1

$ pwd
/home/ramesh

使用 popd +2,您可以删除列表顶部的第二个目录(本例中为 /tmp/dir3)。 Bash 不会切换到该目录。

$ dirs -v
 0 /tmp/dir4
 1 /tmp/dir4
 2 /tmp/dir3
 3 /tmp/dir2
 4 /tmp/dir1

$ popd +2
/tmp/dir4 /tmp/dir4 /tmp/dir2 /tmp/dir1

$ dirs -v
 0 /tmp/dir4
 1 /tmp/dir4
 2 /tmp/dir2
 3 /tmp/dir1

使用 popd -2,您可以删除列表底部的第二个目录(本例中为 /tmp/dir4)。Bash 不会切换到该目录。

注意:当您使用 - 时,最后一项将计为 0。
$ dirs -v
 0 /tmp/dir4
 1 /tmp/dir4
 2 /tmp/dir2
 3 /tmp/dir1

$ popd -2
/tmp/dir4 /tmp/dir2 /tmp/dir1

$ dirs -v
 0 /tmp/dir4
 1 /tmp/dir2
 2 /tmp/dir1