Roc*_*uts 3 bash shell scripting stack pushd
我在我的 bash 脚本中遇到了一些麻烦,无法进行适当的“pushd/popd 清理”。也就是说:如果我做pushd了几次,我想确保popd之前做同样的次数exit。
但是,我注意到 pushd/popd 堆栈似乎不是全局的。
假设我example-pushd-twice.sh在 homedir 中调用了这个脚本:
pushd /etc
pushd /tmp
Run Code Online (Sandbox Code Playgroud)
我从我的 homedir 中的 shell 中执行此操作:(导致块引用中的输出)
dirs
~
./example-pushd-twice.sh
/etc ~
/tmp /etc ~
我现在希望仍然在/tmp并且仍然有一个包含 3 个目录的目录堆栈,但是:
dirs
~
这是正确的行为吗?我可以信任一个 shell 脚本来调用它自己的 pushd/popd 堆栈,这样我就不必关心事后清理了吗?
当 shell(脚本的解释器)退出时,目录堆栈消失了。这与/bin/bash从交互式 shell运行时会得到的行为相同。做了pushd /tmp。然后输入exit. 您要返回的 shell 不受其他bash进程内部发生的事情的影响。
但是,在您获取脚本(即在当前bash进程中运行命令)而不是执行它(创建新的 shell 实例)的情况下,在源文件的最后一行完成后,目录堆栈仍会徘徊。而不是./example-pushd-twice.sh运行source ./example-pushd-twice.sh并观察差异。出于这个原因,如果你依赖pushd于你的脚本,popd在它完成之前仍然是谨慎的。