bash:在脚本末尾 pushd 后不需要调用 popd 吗?

标签 bash shell scripting stack pushd

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

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

假设我的主目录中有这个名为 example-pushd-twice.sh 的脚本:

pushd /etc
pushd /tmp

我在我的 homedir 中的 shell 中执行此操作:(结果输出在 block 引号中)

目录

~

./example-pushd-twice.sh

/etc ~
/tmp /etc ~

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

目录

~

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

最佳答案

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

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

关于bash:在脚本末尾 pushd 后不需要调用 popd 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611960/

相关文章:

php - 寻找 'pick a-or-b'投票系统脚本

bash - 如何使用 BSD `stat` 命令生成带时间戳的文件名的 NUL 分隔流

linux - Bash:了解是否存在具有指定线程 ID 的线程的简便方法?

java - 尝试每个标准 lib 选项后从 java 执行 sudo 命令

linux - Bash 脚本 : if any argument is "N" then function has extra options

java - 最快的 Java 脚本语言?

bash - 如何完全像在Dockerfile中一样运行Docker cmds

Linux:如果字符串在列表中其他位置有子字符串,则从列表中删除字符串

linux - 在 Linux 启动脚本中获取其他脚本

Linux Bash shell 脚本