popd 没有按预期工作

popd 没有按预期工作

看起来pushdpopd没有按预期工作(弹出最后推送的目录)但它弹出第一个目录然后在第二个目录之后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

相关内容