因此,我在工作中有一些安装脚本,它们仅适用于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
必要时。