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
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
.
对于其他问题提出新问题。