~ 带有空模式的 glob 操作符行为

don*_*sti 4 zsh wildcards

根据文档,~ 可以在EXTENDED_GLOB设置时用作glob 运算符,允许像这样的构造

print -rl glob*~globA*~glob*B
Run Code Online (Sandbox Code Playgroud)

所以任何匹配glob*但不匹配globA*和的东西glob*B
好的:

touch file{1,2,3,4{,5}}
setopt extendedglob
Run Code Online (Sandbox Code Playgroud)

现在

print -rl file*~f*3~file4* 
Run Code Online (Sandbox Code Playgroud)

表现如预期:

file1
file2
Run Code Online (Sandbox Code Playgroud)

但是当使用空模式时

print -rl file*~f*3~~file4*
Run Code Online (Sandbox Code Playgroud)

印刷

file1
file2
file3
Run Code Online (Sandbox Code Playgroud)

看起来只有最后一个模式用于过滤第一个 glob 的结果(第二个和第三个 - 这是空的 - 被忽略)。

print -rl file*~f*3~file4*~~
Run Code Online (Sandbox Code Playgroud)

产生

file1
file2
file4
file45
Run Code Online (Sandbox Code Playgroud)

所以现在只使用第二个......
奇怪的是,如果第一个波浪号之后的模式是空的,它根本不起作用,例如

print -rl file*~~f*3~file4*
Run Code Online (Sandbox Code Playgroud)

错误与

zsh: no matches found: file*~~f*3~file4*
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?


这与zsh 5.3.1是否重要...

Mic*_*mer 5

~~不使用空模式。相反,它会做以下两件事之一:

  • 在整个模式的末尾,字面上匹配“ ~~”。
  • 在中间,字面上匹配单个“ ~”,然后移动到下一个排除模式(即文字~后跟~运算符)。

如果我们使用一些额外内容扩展您的文件集,我们可以看到这种情况发生:

touch file3~ file3~~ file4~ file4~~
Run Code Online (Sandbox Code Playgroud)

现在运行你的第一个奇怪的命令:

print -rl file*~f*3~~file4*
file1
file2
file3
file3~~
Run Code Online (Sandbox Code Playgroud)

file3~已被排除,所有三个file4*s 也是如此。file3~~仍然存在,因为它不匹配f*3~

第二个:

print -rl file*~f*3~file4*~~
file1
file2
file3~
file3~~
file4
file45
file4~
Run Code Online (Sandbox Code Playgroud)

Onlyfile4~~已被排除,因为这是唯一一个匹配的file4*~~.

最后一个案例现在确实有输出:

print -rl file*~~f*3~file4*
file3~
file3~~
Run Code Online (Sandbox Code Playgroud)

因为那些是匹配的两个文件file*~,但不匹配f*3file4*.

也许这可能是一个解析错误,至少对于文字然后运算符的情况,但我看不到空排除模式的用途,所以我不确定它应该做什么。