我在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
〜
这是正确的行为吗?我可以信任外壳程序脚本来调用其自己的推入/弹出堆栈,这样我以后就不必担心清理了吗?
答案 0 :(得分:2)
当外壳程序(您的脚本的解释器)退出时,目录堆栈消失了。如果从交互式外壳程序运行/bin/bash
,将获得相同的行为。 pushd /tmp
做过。然后键入exit
。您要返回的外壳不受其他bash
进程内部发生的情况的影响。
但是,在某种情况下,当您脚本源(即您在当前bash
进程中运行命令)而不是执行脚本(创建新的shell实例)时,目录堆栈仍会在最后一行源代码之后徘徊文件完成。代替./example-pushd-twice.sh
运行source ./example-pushd-twice.sh
并观察差异。因此,如果您依靠脚本中的pushd
,在完成之前popd
还是比较谨慎的。