从模拟 bash 返回 unsets zsh opts

Jou*_*aen 4 terminal zsh emulation

所以我有一些设置脚本在工作,它们只适用于bash(因为它们使用 eg==$BASH_SOURCE)。

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

emulate bash
source setupscipt.bash
emulate zsh
Run Code Online (Sandbox Code Playgroud)

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

我应该如何开始和退出 bash 模拟,以便我的选择保持原样?

mpy*_*mpy 5

Zefram 在 20 多年前在 zsh 邮件列表上回答了一个类似的问题

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

function source_bash {
  emulate -L bash
  builtin source "$@"
}
Run Code Online (Sandbox Code Playgroud)

诀窍是选项localoptions(由-Lemulate 调用的参数设置),在手册页中描述如下:

LOCAL_OPTIONS如果在 shell 函数返回时设置此选项,则在进入函数时生效的大多数选项(包括此选项)将被恢复;未恢复的选项是 PRIVILEGED 和 RESTRICTED。否则,仅恢复此选项以及 LOCAL_LOOPS、XTRACE 和 PRINT_EXIT_VALUE 选项。因此,如果这被 shell 函数明确取消设置,则在返回点生效的其他选项将保持不变。shell 函数也可以使用类似“emulate -L zsh”这样的公式来保证自己是一个已知的 shell 配置;-L 激活 LOCAL_OPTIONS。

把这个功能放在你的~/.zshrc身上,你只需要做一个

$ source_bash setupscipt.bash
Run Code Online (Sandbox Code Playgroud)

必要时。

  • @Jounathaen:是的。`localoptions` 选项只恢复 zsh _options_;环境保持不变。但是请尝试一下,如果它完全按照您的需要为您的设置工作。 (2认同)

归档时间:

查看次数:

773 次

最近记录:

6 年,9 月 前