~ 具有空模式的 glob 运算符行为

~ 具有空模式的 glob 运算符行为

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

print -rl glob*~globA*~glob*B

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

touch file{1,2,3,4{,5}}
setopt extendedglob

现在

print -rl file*~f*3~file4* 

行为符合预期:

file1
file2

但是当使用空模式时

print -rl file*~f*3~~file4*

印刷

file1
file2
file3

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

print -rl file*~f*3~file4*~~

产生

file1
file2
file4
file45

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

print -rl file*~~f*3~file4*

错误与

zsh: no matches found: file*~~f*3~file4*

我在这里缺少什么?


zsh 5.3.1如果重要的话……

答案1

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

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

如果我们用一些额外的东西扩展你的文件集,我们可以看到这种情况发生:

touch file3~ file3~~ file4~ file4~~

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

print -rl file*~f*3~~file4*
file1
file2
file3
file3~~

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

第二个:

print -rl file*~f*3~file4*~~
file1
file2
file3~
file3~~
file4
file45
file4~

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

最后的情况现在确实有输出:

print -rl file*~~f*3~file4*
file3~
file3~~

因为这些是两个匹配的文件,但与或file*~都不匹配。f*3file4*

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

相关内容