Linux中的pushd和popd

其实,很早就知道pushd和popd在linux中可以用来方便地在多个目录之间切换。那时比较浮躁,感觉切换目录没必要这么复杂。在实际中,发现通过使用pushd和popd能够极大地提高效率。

0、使用cd -进行目录切换

一般,Shell中都可以通过cd -命令回到之前的目录,下面是一个例子:

$ pwd
/home/lfqy
$ cd /
$ cd -
/home/lfqy
$ 

实际上,cd -中,-就相当于变量$OLDPWD。cd -就相当于cd $OLDPWD。下面是一个例子:

$ pwd
/home/lfqy
$ cd /
$ echo $OLDPWD
/home/lfqy
$ cd $OLDPWD
$ pwd
/home/lfqy
$ 

1、pushd、popd和dirs

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  ~
     $ 
    

这个是怎么移动的哪,我看网上介绍不是很清楚,自己打开数据结构,看了一下。栈是限定在表的一端进行元素的插入和删除运算的线性表,将进行插入和删除的这一端称为栈顶,另一端称为栈底。

push +n和-n是我主要解释的。

这个命令中有队列的影子的。栈中元素移动时,都是从栈顶移出,然后插入到栈底。

(1)我们将栈按像数组一样进行编号,从栈顶开始:0,1,2,3 …

pushd +n 是将编号为n的移到栈顶,移出的0到n-1个元素依次插到栈底。

例如:栈中的元素为a,b,c,d

pushd +1后元素为b,c,d,a

pushd +2后元素为c,d,a,b

pushd +0后元素没有变化:a,b,c,d

(2)对于pushd -n命令和上面一样,只是编号不一样。

这次编号从栈底从开始(假如有4个元素):-3,-2,-1,-0

pushd -n,将编号为-n的移到栈顶,移出的从栈顶到-n-1的元素依次插到栈底。

例如:栈中的元素为a,b,c,d

pushd -1后元素为c,d,a,b

pushd -2后元素为b,c,d,a

pushd -0后元素没有变化:d,a,b,c

(3)总结一下:

假设有n个元素,那么pushd -i 与pushd +(n-1-i) 是相同的。

例如有4个元素的话:

pushd -2与pushd +(4-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开始。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕城南风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值