如果需要在文件系统的多个位置上切换时,惯常的实践就是复制并粘贴路径,然后使用cd命令。但当涉及位置不止一个的时候,这种方法的效率并不高。如果需要在位置之间来回切换,时间都耗费在输入或粘贴路径上了。Bash和其他shell都支持使用pushdpopd命令切换目录。

3.15.1 预备知识

pushdpopd可以用于在多个目录之间切换而无需重新输入目录路径。这两个命令会创建一个路径栈,它是一个保存了已访问目录的LIFO列表(LastInFirstOut,后进先出)。

3.15.2 实战演练

可以使用pushdpopd来代替cd命令。

压入并切换路径

  1. ~ $ pushd /var/www

现在栈中包含/var/www ~,当前目录为 /var/www

再压入下一个目录路径

  1. /var/www $ pushd /usr/src

现在栈中包含/usr/src /var/www ~,当前目录为/usr/src

你可以根据需要压入更多的目录路径。

  1. [root@dev workspace]# dirs
  2. ~/workspace
  3. [root@dev workspace]# ls /usr/src
  4. debug kernels
  5. [root@dev workspace]# ls /var/log
  6. anaconda dnf.librepo.log dnf.rpm.log journal nginx redis wtmp
  7. btmp dnf.log hawkey.log lastlog private sa
  8. [root@dev workspace]# pushd $HOME
  9. ~ ~/workspace
  10. [root@dev ~]# pushd /var/log
  11. /var/log ~ ~/workspace
  12. [root@dev log]# pushd /usr/src
  13. /usr/src /var/log ~ ~/workspace
  14. [root@dev src]#

查看栈的内容

  1. $ dirs
  2. /usr/src /var/log ~ ~/workspace
  1. [root@dev src]# dirs
  2. /usr/src /var/log ~ ~/workspace
  3. [root@dev src]#

切换路径

当你想切换到栈中任意一个路径时,将每条路径从0编号到n,然后使用你希望切换到的路径编号。例如:

  1. $ pushd +3

这条命令会将栈进行翻转并切换到目录/usr/src
image.png

pushd总是向栈中添加路径。如果要从栈中删除路径,可以使用popd

删除最近压入的路径并切换到下一个目录

  1. $ popd

image.png
假设现在栈包含/usr/src /var/log ~ ~/workspace,当前目录是 /usr/srcpopd会将栈更改为/var/log ~ ~/workspace,然后把当前目录切换至/var/log

按编号移除路径

popd +num可以从栈中移除特定的路径。num是从左到右、从0n开始计数的。

  1. [root@dev log]# popd +1
  2. /var/log ~/workspace
  3. [root@dev log]# popd +0
  4. ~/workspace
  5. [root@dev workspace]#

3.15.3 补充内容

让我们再进行一些基本的目录定位练习。

当涉及 3 个以上的目录时,pushdpopd就可以发挥作用了。但是如果只涉及两个位置,还有另一个更简便的方法:cd -

假设当前路径是 /var/www,执行下面的命令:

  1. /var/www $ cd /usr/src
  2. /usr/src $ #做点什么

现在要切换回 /var/www,不需要再输入/var/www了,只执行:

  1. /usr/src $ cd -

你还可以再切换到 /usr/src

  1. /var/www $ cd -

image.png