如何在 zsh 中使用独占通配符?

How to use exclusive wildcard in zsh?

我正在使用 Mac OS Big Sur 11.4,最近切换到 zsh,但在其中使用通配符时遇到了一些问题。假设我有一个包含文件的目录 1 2 3 1file 2file file1 file2 file3 并且我想列出不以数字开头的文件。在 bash 它工作正常如下

Steves-Mac:test hengyuan$ cd test/dir3/
Steves-Mac:dir3 hengyuan$ ls
1     1file 2     2file 3     file1 file2 file3
Steves-Mac:dir3 hengyuan$ ls [[:digit:]]*
1     1file 2     2file 3
Steves-Mac:dir3 hengyuan$ ls [![:digit:]]*
file1 file2 file3

但是,我在zsh中得到了如下结果

➜  dir3 ls
1     1file 2     2file 3     file1 file2 file3
➜  dir3 ls [[:digit:]]*
1     1file 2     2file 3
➜  dir3 ls [![:digit:]]*
zsh: event not found: [

为什么我会得到如此奇怪的结果以及如何解决这些问题?谢谢。

使用 zsh ! 调用历史扩展。您可以使用 [^...],这与 [!...] 的含义相同。您还可以通过引用 [\!...] 或使用特殊序列 !" 来禁用历史扩展,这将完全禁用当前命令行的历史扩展。

所以这些都是等价的:

ls [^[:digit:]]*
ls [\![:digit:]]*
ls !" [![:digit:]]*

要完全禁用历史扩展,您可以 运行 setopt nobanghist.