在 zsh 中恢复函数末尾的选项

Abh*_*uch 6 shell zsh shell-script function

我正在编写一个 zsh shell 函数(而不是脚本),我非常希望在其中extended_glob启用该选项。但是由于该函数在调用者的上下文中运行,我不想破坏他们的设置。

我想做的是有条件地启用extended_glob,只要我需要它,然后将其恢复到用户的选项。有没有办法检查zsh中是否启用了一个选项?

Chr*_*sen 12

您可以使用该local_options选项在该功能退出时自动恢复选项。这仅适用于您的函数没有进行任何其他您打算在函数完成后保留的选项更改。

因此,您可以像这样编写函数:

do_something() {
  setopt local_options extended_glob
  ?
}
Run Code Online (Sandbox Code Playgroud)

如果您希望在函数返回后保留一些其他选项,您可以使用options关联数组(来自zsh/parameter模块)来轻松检查和操作各个选项:

do_something() {
  local eg=$options[extended_glob]
  setopt extended_glob
  ?
  options[extended_glob]=$eg
}
Run Code Online (Sandbox Code Playgroud)

如果此模块在您的安装中不可用,那么您可以使用-o 测试

do_something() {
  local eg=no
  [[ -o extended_glob ]] && eg=
  setopt extended_glob
  ?
  setopt ${eg}extended_glob
}
Run Code Online (Sandbox Code Playgroud)