shell模式匹配逻辑

shell模式匹配逻辑

两者之间的逻辑区别是什么

  1. ll -d !(.*@(ry|rc))
  2. ll -d !(.*{ry,rc})

在我的主目录中使用它们,第二个匹配.bash_history.xinputrc,而第一个则不匹配。

笔记:

$ shopt extglob
extglob         on

答案1

ll -d -- !(.*{ry,rc})

结合了通配符和大括号扩展。首先将其扩展为:

ll -d -- !(.*ry) !(.*rc)

这些球体单独扩张。第一个匹配.inputrcbash -O extglob但不是在ksh该语法的来源中,也不是zshksh模拟中,因为这些是隐藏文件,并且没有明确请求点文件)。

您可以在这些 glob 与任何文件都不匹配的目录中验证这一点(在这种情况下,glob 保持不变,bash这是您可以解决的另一个错误功能shopt -s failglob),例如在您没有读取权限的目录中:

$ chmod a-r .
$ bash -O extglob -c 'echo ll -d -- !(.*{ry,rc})'
ll -d -- !(.*ry) !(.*rc)

而在

ll -d -- !(.*@(ry|rc))

那是一团。

在这里,您还可以执行以下操作:

ll -d -- !(.*r[cy])

或者:

ll -d -- !(.*rc|.*ry)

请注意,该扩展中bash还包含.和。..如果您想排除它们(我确信您会这样做)但仍然包含隐藏文件,您需要:

shopt -s dotglob
ll -d -- !([.]*@(rc|ry))

或者您可以明确排除它们:

ll -d -- !(.*@(rc|ry)|.|..)

在 中zsh -o extendedglob,我会这样做:

ll -d -- ^.*(rc|ry)(D)

( 仅针对该 glob(D)激活)。dotglob

相关内容