3

我在我的 bash 脚本中做一些适当的“pushd/popd 清理”时遇到了一些麻烦。那就是:如果我做pushd了几次,我想确保做相同数量的popdbefore exit

但是,我注意到 pushd/popd 堆栈似乎不是全局的。

假设我example-pushd-twice.sh在 homedir 中调用了这个脚本:

pushd /etc
pushd /tmp

我从我的 homedir 中的 shell 执行此操作:(导致输出块引用)

dirs

~

./example-pushd-twice.sh

/etc ~
/tmp /etc ~

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

dirs

~

这是正确的行为吗?我可以信任一个 shell 脚本来调用它自己的 pushd/popd 堆栈,这样我就不必关心事后清理了吗?

4

1 回答 1

6

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

但是,在您获取脚本(即在当前bash进程中运行命令)而不是执行它(创建新的 shell 实例)的情况下,在源文件的最后一行完成后,目录堆栈仍然会徘徊。而不是./example-pushd-twice.sh运行source ./example-pushd-twice.sh并观察差异。出于这个原因,如果你在你的脚本中依赖,在它完成之前pushd仍然是谨慎的popd

于 2019-02-09T23:46:02.160 回答