从模拟 bash 返回取消设置 zsh opts

从模拟 bash 返回取消设置 zsh opts

因此,我在工作中有一些安装脚本,它们仅适用于bash(因为它们使用例如==$BASH_SOURCE)。

可以使用 zsh 的emulate命令来获取这些脚本:

emulate bash
source setupscipt.bash
emulate zsh

但这会重置我的 zsh opts,如“autocd”(在 .zshrc 中设置)。

我应该如何启动和退出 bash 模拟,以便我的 opts 保持原样?

答案1

Zefram 20 多年前在 zsh 邮件列表中回答过类似的问题

解决方案是使用一个函数(我们称之为source_bash)来获取你的 bash 脚本:

function source_bash {
  emulate -L bash
  builtin source "$@"
}

诀窍在于选项localoptions(由模拟调用的参数设置-L),其在手册页中描述如下:

本地选项如果在从 shell 函数返回时设置此选项,则大多数在进入该函数时有效的选项(包括此选项)都会恢复;未恢复的选项为 PRIVILEGED 和 RESTRICTED。否则,只有此选项以及 LOCAL_LOOPS、XTRACE 和 PRINT_EXIT_VALUE 选项会恢复。因此,如果 shell 函数明确取消设置此选项,则在返回时有效的其他选项将保持不变。shell 函数还可以使用类似“emulate -L zsh”的公式来保证自己具有已知的 shell 配置;-L 激活 LOCAL_OPTIONS。

将此功能放入您的~/.zshrc,您只需要执行

$ source_bash setupscipt.bash

必要时。

相关内容