将 -n 选项与 Pushd 和 Popd 一起使用

将 -n 选项与 Pushd 和 Popd 一起使用
  1. popd

    从目录堆栈中删除顶部条目,然后 cd 到新的顶部目录。当没有给出参数时,popd 将从堆栈中删除顶级目录并执行 cd 到新的顶级目录。元素从 0 开始编号,从 dirs 列出的第一个目录开始;即popd相当于popd+0。

    -n
    从堆栈中删除目录时禁止目录的正常更改,以便仅操作堆栈。

    /home/t$ dirs -v
     0  ~
     1  /tmp
     2  ~/mydata
    /home/t$ popd -n
    ~ ~/mydata
    /home/t$ dirs -v
     0  ~
     1  ~/mydata
    

    为什么不:

    /home/t$ dirs -v
     0  /tmp
     1  ~/mydata
    
  2. pushd

    选项:

    -n 添加时禁止正常更改目录
            目录到堆栈,因此只操作堆栈。
    

    论据:

    +N 旋转堆栈,使第 N 个目录(计数
            从“dirs”显示的列表的左侧开始,从
            零)位于顶部。
    
    -N 旋转堆栈,以便第 N 个目录(计数
            从“dirs”显示的列表右侧开始,从
            零)位于顶部。
    

    dir 将 DIR 添加到顶部的目录堆栈中,使其成为
            新的当前工作目录。

    /tmp$ dirs -v
     0  /tmp
     1  ~
     2  ~/mydata
    /tmp$ pushd -n +1
    /tmp$ dirs -v
     0  /tmp
     1  ~/mydata
     2  /tmp
    

    为什么不:

    /tmp$ dirs -v
     0  ~
     1  ~/mydata
     2  /tmp
    

    或者

    /tmp$ dirs -v 0 /tmp 1 ~ 2 ~/mydata

答案1

堆栈的顶部dirs始终是当前目录。并且-n应该防止目录的更改。所以-n应该防止栈顶的改变。

假设你在~(那么你的堆栈顶部是~)。现在你跑popd 没有 -n~然后,堆栈的最顶部元素将被删除,当前目录将更改为/tmp.

~ $

 0  ~
 1  /tmp
 2  ~/mydata 

~ $ popd

 0  /tmp
 1  ~/mydata

/tmp $ # you are now in /tmp

该标志-n应该禁止这种行为。因此,它不是删除堆栈最顶部的元素,而是删除顶部第二个元素。因此,如果您运行,popd -n当前目录保持不变。

~ $

 0  ~
 1  /tmp  # we will remove this one
 2  ~/mydata 

~ $ popd -n

 0  ~
 1  ~/mydata

~ $ # you are still in ~

对于pushd,情况就比较复杂了。该+N符号将第 N 个元素移动到顶部,从而旋转堆栈。因此,如果您进入/tmp(堆栈顶部是/tmp)并运行,pushd +1堆栈将进行以下转换,并且当前目录将更改为~

/tmp $ pushd +1

             ----------------------------
             |                          |
 0  /tmp -----     |------>0 ~          |
 1  ~ --------------   |-->1 /mydata    |
 2  ~/mydata------------   2 /tmp  <----|


~ $ # you are now in ~

再次-n应该抑制当前目录的更改。所以它做的都是相同的,但不是放入~堆栈顶部,而是保持堆栈顶部不变(即/tmp):

/tmp $ pushd -n +1

             ----------------------------
             |                          |
 0  /tmp -----     |------>0 /tmp       | # instead of ~ 
 1  ~ --------------   |-->1 /mydata    |
 2  ~/mydata------------   2 /tmp  <----|


/tmp $ # you are still in /tmp

好吧,我同意这不是一个明显的行为。但如果你记得将目录放到顶部是通过进入cd该目录来实现的,那么它就更容易理解了。在最后一个示例 ( ) 中,由于指定了标志,因此未执行pushd -n +1命令。因此,你仍然在 中,因此堆栈的顶部仍然是。 cd ~-n/tmp/tmp

答案2

其作用非常明显-n:它不会更改索引 0 处的堆栈。

索引 0 始终是$PWD(或pwd) 并且是不是-n如果使用 选项则更改。

即:popd或者pushd不会执行cd.

对于其他问题提出新问题。

相关内容