我有一个脚本,我在 bash 中使用它。它做各种事情并保留$PWD
我在采购它之前的状态。
pushd ~/.dotfiles >/dev/null || exit 1
# Do various things
popd >/dev/null || exit 1
该脚本在 zsh 中也(大部分)运行良好,但是当我从该~/.dotfiles
位置获取它时,我在获取它之后最终进入了前一个$OLDPWD
。
pushd
如果当前位置已经相同,zsh 似乎会忽略该行,因此该popd
命令会转到$OLDPWD
脚本来源之前的位置。
有没有办法阻止 zsh 忽略“冗余”pushd
命令,同时保持脚本与 bash 兼容?
我的 中确实有以下内容.zshrc
,但当我取消设置它们时也会发生这种情况:
setopt AUTO_PUSHD PUSHD_SILENT PUSHD_IGNORE_DUPS
pushd
并popd
旨在方便交互。它们在脚本中既不可靠也没有用。您看到了 的效果
pushd_ignore_dups
,默认情况下它是关闭的,但您显然已经在您的配置中启用了。pushd
和的另一个潜在问题popd
是你需要确保你真的是成对调用它们。在错误路径上意外遗漏 a 的风险很高popd
,这会在各处引起混乱。在要获取的辅助脚本中,通常根本不应该更改当前目录。只需在任何地方使用绝对路径。
如果你真的想改变当前目录,使用
cd
命令。将旧的当前目录保存在变量中。这适用于所有 Bourne 风格的 shell(即使是那些没有实现
pushd
and 的popd
),并且永远不会恢复错误的目录。但是,任何基于更改出目录并返回的代码都会在一种不寻常的情况下中断:如果您没有更改回原始目录的权限。这可能发生在进程失去特权之后。
你需要一个if-then-else来自你的实际答案。
请注意
||
)pushd
我试过这个,这似乎有效,但我想知道任何其他更好的方法,因为它看起来非常可怕:
更新不,这实际上不起作用,因为终端在
~/.dotfiles
目录中关闭时。