bash:在脚本末尾推送后是否不需要调用popd?

时间:2019-02-09 23:41:59

标签: bash shell scripting stack pushd

我在bash脚本中进行一些适当的“推送/弹出式清理”时遇到了麻烦。那就是:如果我做了几次pushd,我想确保在popd之前重复做同样数量的exit

但是,我注意到推送/弹出堆栈似乎不是全局的。

假设我的homedir中有一个名为example-pushd-twice.sh的脚本:

pushd /etc
pushd /tmp

然后我从homedir内的shell中执行此操作:(以块引用的形式输出结果)

dirs

  

./example-pushd-twice.sh

  

/ etc〜
  / tmp / etc〜

我现在希望仍然在/tmp中,并且仍然具有3个目录的目录堆栈,但是:

dirs

  

这是正确的行为吗?我可以信任外壳程序脚本来调用其自己的推入/弹出堆栈,这样我以后就不必担心清理了吗?

1 个答案:

答案 0 :(得分:2)

当外壳程序(您的脚本的解释器)退出时,目录堆栈消失了。如果从交互式外壳程序运行/bin/bash,将获得相同的行为。 pushd /tmp做过。然后键入exit。您要返回的外壳不受其他bash进程内部发生的情况的影响。

但是,在某种情况下,当您脚本源(即您在当前bash进程中运行命令)而不是执行脚本(创建新的shell实例)时,目录堆栈仍会在最后一行源代码之后徘徊文件完成。代替./example-pushd-twice.sh运行source ./example-pushd-twice.sh并观察差异。因此,如果您依靠脚本中的pushd,在完成之前popd还是比较谨慎的。