根据文档,~
可以用作全局运算符当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*3
file4*
也许这可能是一个解析错误,至少对于文字然后运算符的情况而言,但我看不到空排除模式的用途,所以我不确定它还应该做什么。