bash 脚本中的目录堆栈(pushd 和 popd)行为

bash 脚本中的目录堆栈(pushd 和 popd)行为

如果我写得不好,pushd /etc但我没有完成它popd:脚本完成执行并且 Bash 终止后,它/etc仍然会在pushd+popd目录 stack/in RAM中吗?bash

如果我关闭终端仿真器会话(这应该终止该终端仿真器会话的 shell 进程)而不手动清除它,那么pushd+目录堆栈是否会popd被清除(就像变量一样)?bashpopd

答案1

pushdpopd命令使用的目录堆栈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将当前目录推送到目录堆栈上,关闭终端,然后打开一个新终端。在新终端中我们看到之前推送的目录不在堆栈中。

相关内容