Linux下使用pushd和popd高效切换目录

pushd和popd是对一个目录栈进行操作,而dirs是显示目录栈的内容。而目录栈就是一个保存目录的栈结构,该栈结构的顶端永远都存放着当前目录。

1、pushd、popd和dirs

1.1 dirs

dirs常用的有两个参数:

选项 含义
-p 每行显示一条记录
-v 每行显示一条记录,同时展示该记录在栈中的index
-c 清空目录栈

下面没有显示地对目录栈进行任何操作,我们来看下当前目录栈的内容是什么:

pwd
/home/lfqy
$ dirs -v
0  ~
$ cd /
$ dirs -v
0  /
$ dirs -c
$ dirs -v
0  /
$

可以看出,目录栈中只有一个目录(当然是在栈顶),就是当前所在的目录。当切换目录之后,栈中的目录也随之改变。通过-c选项可以将目录栈中除当前目录之外的其它目录清除,由于上面的例子中目录栈只包含当前目录,所以没有变化。

1.2 pushd

每次pushd命令执行完成之后,默认都会执行一个dirs命令来显示目录栈的内容。pushd的用法主要有如下几种:

  1. pushd 目录

    pushd后面如果直接跟目录使用,会切换到该目录并且将该目录置于目录栈的栈顶。(时时刻刻都要记住,目录栈的栈顶永远存放的是当前目录。如果当前目录发生变化,那么目录栈的栈顶元素肯定也变了;反过来,如果栈顶元素发生变化,那么当前目录肯定也变了。)下面是一个例子:

    pwd
    /home/lfqy
    $ pushd /
    / ~
    $ dirs -v
    0  /
    1  ~
    $ pushd ~/Music/
    ~/Music / ~
    $ dirs -v
    0  ~/Music
    1  /
    2  ~
    $
    

    这样,不难看出,用pushd在切换目录的同时,也将历史目录以栈结构的形式保存了下来。

  2. pushd不带任何参数。

    pushd不带任何参数执行的效果就是,将目录栈最顶层的两个目录进行交换。前面说过,栈顶目录和当前目录一个发生变化,另一个也变。这样,实际上,就实现了cd -的功能。下面是一个例子(这个例子接上文的执行现场):

    dirs -v
    0  ~/Music
    1  /
    2  ~
    $ pushd
    / ~/Music ~
    $ dirs -v
    0  /
    1  ~/Music
    2  ~
    $ pushd
    ~/Music / ~
    $ dirs -v
    0  ~/Music
    1  /
    2  ~
    $
    
  3. pushd +n

    到这里,可能会想如果想切换到目录栈中的任意一个目录,该如何?pushd +n正是这个作用:pushd +n切换到目录栈中的第n个目录(这里的n就是dirs -v命令展示的index),并将该目录以栈循环的方式推到栈顶。下面是一个例子(接上文的执行现场),注意栈循环的方式带来的栈中内容的变化规律:

    dirs -v
    0  ~/Music
    1  /
    2  ~
    $ pushd +2
    ~ ~/Music /
    $ dirs -v
    0  ~
    1  ~/Music
    2  /
    $ pushd +1
    ~/Music / ~
    $ dirs -v
    0  ~/Music
    1  /
    2  ~
    $
    

1.3 popd

每次popd命令执行完成之后,默认都会执行一个dirs命令来显示目录栈的内容。popd的用法主要有如下几种:

  1. popd不带参数

    popd不带任何参数执行的效果,就是将目录栈中的栈顶元素出栈。这时,栈顶元素发生变化,自然当前目录也会发生相应的切换(接上文的执行现场),下面是一个例子:

    dirs -v
    0  ~/Music
    1  /
    2  ~
    $ popd
    / ~
    $ dirs -v
    0  /
    1  ~
    $ popd
    ~
    $ dirs -v
    0  ~
    $
    
  2. popd +n

    将目录栈中的第n个元素删除(这里的n就是命令dirs -v显示的目录index)。下面是一个例子:

    dirs -v
    0  ~/Music
    1  /
    2  ~
    $ popd +2
    ~/Music /
    $
    

    这里可以发现,如果对于目录栈的操作没有引发栈顶元素的变化,将不会导致当前目录的切换。

2、pushd和popd的+n和-n

上面我们用的都是+n作为参数,实际在使用pushd和popd的时候,有时候也会用到-n参数。两者的差别如下:+n的含义是从栈顶往栈底方向进行计数,从0开始;-n的含义刚好相反,从栈底向栈顶方向计数,从0开始。这样有点拗口,实际上,从默认的dirs命令(不带任何参数)的输出来解释最好理解了:+n是指从左往右数,-n是指从右往左数,都是从0开始。

原创文章,作者:晴川运维,如若转载,请注明出处:https://baike.qcidc.com/14686.html

(0)
晴川运维晴川运维
上一篇 2025年10月7日
下一篇 2025年10月7日

相关推荐

  • win10下Linux子系统的安装具体步骤

    相信大家都会对Linux系统有一定程度的需求,但是目前所有Linux发行版的桌面环境实在是不太友好,并不能完全满足我们所有的学习和娱乐。于是我们会想到安装Windows+Linux…

    Linux系统 2025年6月12日
  • Shell 脚本演练:日志关键字监控+自动告警

    该程序使用场景说明:主要用于Linux服务器监控程序日志,如出现关键字异常则触发相应的动作或告警操作,通知到邮件联系人。 一、安装邮件服务 1、解压 tar -jxf&n…

    Linux系统 2025年6月14日
  • Linux 中TCP Wrappers访问控制

    TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含有libwrap.so库文件的的程序就可以受TCP_Wr…

    Linux系统 2025年6月27日
  • DNS在什么场景下选择TCP与UDP协议

    DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类。但很少有人知道DNS分别在什么情况下使用这两种协议。 TCP与…

    Linux系统 2025年6月8日
  • Linux LVM逻辑卷管理机制(硬盘分区管理机制)

    我们在实际使用 linux 服务器的时候,总会有一个让人头疼的问题,随着业务的增加,文件系统负载会越来越大,当到了空间不足的情况时,如果我们还在使用传统的分区方式管理硬盘,就不得不…

    Linux系统 2025年7月6日
  • 查看MongoDB版本信息具体方法

    本篇文章重点为大家讲解一下查看MongoDB版本信息具体方法,有需要的小伙伴可以参考一下。 1:连接到MongoDB,使用命令查看。 > db.version();…

    Linux系统 2025年10月7日
  • SELinux默认安全上下文的查询和修改(semanage命令)

    前面讲到,restorecon 命令可以将文件或目录恢复成默认的安全上下文,这就说明每个文件和目录都有自己的默认安全上下文,事实也是如此,为了管理的便捷,系统给所有的系统默认文件和…

    Linux系统 2025年10月23日
  • 详解C++中常量与指针

    在面试中我们经常会被面试官问到什么是常量指针,什么又是指针常量,在C++中也很容易把常量与指针常量与指针搞混,下面为大家详细讲解一下C++中常量与指针。 前言 和指针联用有佷微妙的…

    Linux系统 2025年9月24日
  • Python中非常重要的5个特性

    Python 是近十年来兴起的编程语言,并且被证明是一种非常强大的语言。我用 Python 构建了很多应用程序,从交互式地图到区块链。 Python 是近十年来兴起的编程语言,并且…

    Linux系统 2025年6月14日
  • 配置高可用RabbitMQ集群

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解,本篇文章重点为大家讲解一下配置高可…

    Linux系统 2025年6月23日

发表回复

登录后才能评论