bash: 脚本末尾pushd后不需要调用popd吗?
bash: no need to call popd after pushd at the end of a script?
我在 bash 脚本中做一些正确的 "pushd/popd cleanup" 时遇到了一些麻烦。也就是说:如果我做了几次 pushd
,我想确保在 exit
.
之前做同样数量的 popd
但是,我注意到 pushd/popd 堆栈似乎不是全局的。
假设我的主目录中有这个名为 example-pushd-twice.sh
的脚本:
pushd /etc
pushd /tmp
我从我的主目录中的 shell 执行此操作:(结果输出以块引号表示)
dirs
~
./example-pushd-twice.sh
/etc ~
/tmp /etc ~
我现在希望仍然在 /tmp
并且仍然有一个包含 3 个目录的目录堆栈,但是:
dirs
~
这是正确的行为吗?我可以信任 shell 脚本来调用它自己的 pushd/popd 堆栈,这样我就不必关心之后的清理工作了吗?
当 shell(您的脚本的解释器)退出时,目录堆栈消失了。这与您从交互式 shell 运行 /bin/bash
得到的行为相同。做了pushd /tmp
。然后输入 exit
。您要返回的 shell 不受其他 bash
进程中发生的事情的影响。
但是,在您获取脚本的情况下(即您 运行 当前 bash
进程中的命令)而不是执行它(创建新的 shell 实例)目录源文件的最后一行完成后,堆栈仍会徘徊。而不是 ./example-pushd-twice.sh
运行 source ./example-pushd-twice.sh
并观察差异。出于这个原因,如果您在脚本中依赖 pushd
,在它完成之前 popd
仍然是谨慎的做法。
我在 bash 脚本中做一些正确的 "pushd/popd cleanup" 时遇到了一些麻烦。也就是说:如果我做了几次 pushd
,我想确保在 exit
.
popd
但是,我注意到 pushd/popd 堆栈似乎不是全局的。
假设我的主目录中有这个名为 example-pushd-twice.sh
的脚本:
pushd /etc
pushd /tmp
我从我的主目录中的 shell 执行此操作:(结果输出以块引号表示)
dirs
~
./example-pushd-twice.sh
/etc ~
/tmp /etc ~
我现在希望仍然在 /tmp
并且仍然有一个包含 3 个目录的目录堆栈,但是:
dirs
~
这是正确的行为吗?我可以信任 shell 脚本来调用它自己的 pushd/popd 堆栈,这样我就不必关心之后的清理工作了吗?
当 shell(您的脚本的解释器)退出时,目录堆栈消失了。这与您从交互式 shell 运行 /bin/bash
得到的行为相同。做了pushd /tmp
。然后输入 exit
。您要返回的 shell 不受其他 bash
进程中发生的事情的影响。
但是,在您获取脚本的情况下(即您 运行 当前 bash
进程中的命令)而不是执行它(创建新的 shell 实例)目录源文件的最后一行完成后,堆栈仍会徘徊。而不是 ./example-pushd-twice.sh
运行 source ./example-pushd-twice.sh
并观察差异。出于这个原因,如果您在脚本中依赖 pushd
,在它完成之前 popd
仍然是谨慎的做法。