看起来pushd
和popd
没有按预期工作(弹出最后推送的目录)但它弹出第一个目录然后在第二个目录之后popd
进入主目录。
user@ubuntu:~$ pushd /tmp/dir1
/tmp/dir1 ~
user@ubuntu:/tmp/dir1$ pushd /tmp/dir2
/tmp/dir2 /tmp/dir1 ~
user@ubuntu:/tmp/dir2$ cd ..
user@ubuntu:/tmp$ popd
/tmp/dir1 ~
user@ubuntu:/tmp/dir1$ popd
~
这有什么原因吗?
在 VMware Workstation 12 Player 中使用 Ubuntu 16.04 LTS
答案1
/tmp/dir1
最后一次弹出后它会转到主目录,因为当您推送到此堆栈时,您位于主目录中。~
是您的主目录。此部分:
user@ubuntu:~$ pushd /tmp/dir1
/tmp/dir1 ~
具体来说,当目录堆栈为空时,它会将当前工作目录添加到堆栈的底部。
以下是一个例子/etc
:
bash-4.3$ cd /etc
bash-4.3$ pushd /usr
/usr /etc
该popd
行为也是正确的,它确实删除了最旧的推送目录,但您也错过了在删除旧目录后它会转到新的顶级目录的部分。再次阅读手册:
popd [-n] [+n] [-n] 从目录堆栈中删除条目。如果不带参数,删除顶层目录 从堆栈中执行 cd 到新的顶级目录。
因此,对于堆栈/tmp/dir2 /tmp/dir1 ~
,首先popd
删除/tmp/dir2
。那么堆栈的新顶部是什么?/tmp/dir1
,因此它也将执行cd /tmp/dir1
。
观察:
bash-4.3$ pwd
/etc
bash-4.3$ pushd /bin
/bin /etc
bash-4.3$ pushd /usr
/usr /bin /etc
bash-4.3$ pushd /sys
/sys /usr /bin /etc
bash-4.3$ popd
/usr /bin /etc
bash-4.3$ pwd
/usr