在 zsh 中,如何在文件名生成 glob 中启用 extended_glob inline?
假设我想ls
在所有未命名的路径上运行a
,可以通过以下方式完成:
setopt -o extendedglob
ls ^a
但是,有没有办法可以在不使用的情况下为上述文件名生成 glob 启用 extended_glob setopt -o extendedglob
?
我知道我可以使用(*)
参数扩展标志来启用extended_glob inline(不使用setopt -o extendedglob
)以进行正则表达式参数扩展,例如:
printf $'%s\n' "${(*)x#^a}"
只需启用
extended_glob
。我想不出不这么做的理由。默认关闭的唯一原因
extended_glob
是默认配置是向后兼容的,这可以追溯到extended_glob
存在之前。它不会改变您可能编写的许多内容的行为。我在实践中遇到的唯一问题是,偶尔我需要在命令参数中引用或^
,#
但这比我想要使用^
或#
作为通配符的情况要少见。如果您想避免在代码中更改选项,请将选项设为本地选项。无论如何,您都需要在可能在未指定上下文中运行的函数中执行此操作。调用
emulate -L
以在函数执行期间将与脚本相关的选项设置为其默认值,并在函数返回时恢复它们。如果您只想更改一行代码的设置,您可以将其放在匿名函数中。
顺便说一句,目前
*
参数扩展标志没有帮助,因为它只影响替换,而不影响文件名生成(但影响文件名生成将是一个有用的功能)。您可以使用允许省略名称的形式在参数替换中扩展 glob ,结合形式,例如列出名称不以 开头的文件。但除非已启用,否则不起作用,因为(目前)对由 引起的通配符没有影响。${name:-word}
${~spec}
echo ${~:-[^a]*}
a
echo ${(*)~:-^a*}
extended_glob
*
glob_subst
如果你想保持
extendedglob
禁用状态,可以采取一个(丑陋的)技巧:然后使用以下参数
#x
启用它,直到禁用它:extendedglob
#X