Linux之pushd、popd和dirs的使用讲解,比 cd -更高效

发布时间 2023-04-21 10:01:13作者: jack_Meng

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

命令dirs、pushd、popd语法格式

dirs命令

[root@testserver ~]# help main dirs
dirs: dirs [-clpv] [+N] [-N]
    显示目录栈。
    显示当前记住的目录列表。通过 `pushd' 命令可以将目录存入列表中;`popd' 命令可用于遍历列表。
    选项:
      -c        删除所有元素以清空目录栈
      -l        不打印与主目录相关的波浪号前缀的目录
      -p        每行一个条目打印目录栈
      -v        每行一个条目,以栈中位置为前缀打印目录栈
    参数:
      +N        显示 dirs 不带选项启动时显示的目录列表左起中第N 个目录,从零开始。
      -N        显示 dirs 不带选项启动时显示的目录列表右起中第N 个目录,从零开始。
    退出状态:
    返回成功,除非使用了无效的选项或者发生错误。

 

pushd命令

[root@testserver ~]# help main pushd
pushd: pushd [-n] [+N | -N | dir]
    将目录添加到栈中。
    将目录添加到目录栈顶,或着旋转栈直到当前工作目录成为    新的栈顶。不带参数时,交换栈顶的两个目录。
    选项:
      -n        抑制添加目录至栈时通常的改变目录操作,从而仅对栈进行操作。
    参数:
      +N        旋转栈从而第 N 个目录(`dirs' 显示的列表中左起,从零开始)将移动到栈顶。
      -N        旋转栈从而第 N 个目录(`dirs' 显示的列表中右起,从零开始)将移动到栈顶。
      dir       将 DIR 目录添加到栈顶,并且使其成为当前工作目录。
    `dirs' 内嵌显示目录栈。
    退出状态:
    返回成功,除非使用了无效的参数或者目录转换失败。

 

popd命令

[root@testserver ~]# help main popd
popd: popd [-n] [+N | -N]
    从栈中删除目录。
    从目录栈中删除条目。不带参数时,删除栈顶目录,并改变至新的栈顶目录。
    选项:
      -n        抑制从栈中删除目录时通常的目录变换操作,从而仅对栈进行操作。
    参数:
      +N        删除第 N 个目录(`dirs' 显示的目录列表中左起,从零开始)。
        例如: `popd +0' 删除第一个目录,popd +1' 删除第二个。
      -N        删除第 N 个目录(`dirs' 显示的目录列表中右起,从零开始)。
        例如: `popd -0'删除最后一个目录,,`popd -1' 删除倒数第二个。
    `dirs' 内嵌显示目录栈。
    退出状态:
    返回成功,除非使用了无效的参数或者目录变换失败。

 

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

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开始。

作者:SpaceCat
链接:https://www.jianshu.com/p/53cccae3c443
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

 

出处:https://www.cnblogs.com/lvzh/p/16306877.html

===================================================================================