55. dirs、pushd 和 popd
使用 dirs
、pushd
和 popd
来操作 bash 目录堆栈。 您可以使用目录堆栈分别通过压入和弹出来保存和恢复当前工作目录。
dirs
:显示目录堆栈pushd
:将目录推入堆栈popd
:从堆栈中弹出目录并cd
到该目录
dirs
将始终打印当前目录,然后打印堆栈的内容。 即使目录堆栈为空,dirs
命令仍会打印当前目录。 请记住:~
代表您的主目录。
$ popd
-bash: popd: directory stack empty
$ dirs
~
$ pwd
/home/ramesh
如何使用 pushd
和 popd
让我们首先创建一些临时目录。
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
命令在一行中打印目录堆栈的内容,如下所示。
$ 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
pushd
默认情况下,当您执行 pushd
命令时,除了将该目录放入目录堆栈之外,bash 还会对该目录执行 cd
操作。
使用pushd -n
选项,您可以将目录添加到堆栈中,而无需切换到它。
将主目录推入堆栈,但不更改您的工作目录:
$ cd ~
$ pushd -n /etc/
$ pwd
/home/ramesh
您还可以将 +n
或 -n
与 pushd
一起使用,分别向上或向下旋转目录堆栈。
让我们假设目录堆栈包含以下列表。
$ 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
默认情况下,当您执行 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