如果我写得不好,pushd /etc
但我没有完成它popd
:脚本完成执行并且 Bash 终止后,它/etc
仍然会在pushd
+popd
目录 stack/in RAM中吗?bash
如果我关闭终端仿真器会话(这应该终止该终端仿真器会话的 shell 进程)而不手动清除它,那么pushd
+目录堆栈是否会popd
被清除(就像变量一样)?bash
popd
答案1
pushd
和popd
命令使用的目录堆栈bash
是当前 shell 的本地目录堆栈。这意味着如果您不在popd
脚本中使用,这不会影响脚本外部的目录堆栈。
如果关闭终端(因为 shell 终止),堆栈将被清空。
每当您启动新 shell 时,默认情况下目录堆栈也是空的bash
。
答案2
您可以进行一些简单的实验来找到问题的答案。有时,学习新工具的最佳方法就是使用它们。
如果我编写了一个使用pushd /etc的脚本,但我没有用popd完成它:在Bash脚本完成执行并且Bash终止后,/etc是否仍然位于pushd+popd目录堆栈/RAM中?
$ cd /tmp
$ echo 'pushd /etc' > experiment.sh
$ bash experiment.sh
/etc /tmp
$ pwd
/tmp
$
上面experiment.sh
是写得不好的脚本。它用于pushd
将当前目录压入堆栈并切换到/etc/
然后终止。脚本终止后,正在运行的 shell 仍处于/tmp
.
如果我关闭终端仿真器会话(这应该终止该终端仿真器会话的 Bash shell 进程)而不使用 popd 手动清除它,pushd+popd 目录堆栈也会清除(就像变量一样)吗?
$ cd /tmp
$ pushd /etc
/etc /tmp
$ dirs
/etc /tmp
-- close terminal --
-- open new terminal --
$ dirs
~
在上面的一个 shell 中,我们使用pushd
将当前目录推送到目录堆栈上,关闭终端,然后打开一个新终端。在新终端中我们看到之前推送的目录不在堆栈中。