【问题标题】:bash: no need to call popd after pushd at the end of a script?bash:在脚本末尾 pushd 后不需要调用 popd 吗?
【发布时间】:2019-07-03 20:23:24
【问题描述】:

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

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

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

pushd /etc
pushd /tmp

我从我的 homedir 中的 shell 执行此操作:(结果输出为块引用)

dirs

~

./example-pushd-twice.sh

/等~
/tmp /等~

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

dirs

~

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

【问题讨论】:

    标签: bash shell scripting stack pushd


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      相关资源
      最近更新 更多