Bash 为什么这个模式与'ab'匹配,而与'ba'不匹配?

Bash 为什么这个模式与'ab'匹配,而与'ba'不匹配?,bash,pattern-matching,Bash,Pattern Matching,我在bash中摆弄了一下,但是反向匹配器有些奇怪!(图案)。考虑下面的例子 $ touch ab ba $ shopt -s extglob $ echo *a* ab ba $ echo !(a)*a* ab ba $ echo *a*!(a) ab 现在看起来像是!()匹配空字符串,但为什么*a*!(a) 匹配ba 我假设在第二个例子中,ab是这样匹配的 !(a) -> "" * -> "" a -> "a" * -> "b" 在第三种

我在bash中摆弄了一下,但是反向匹配器
有些奇怪!(图案)
。考虑下面的例子

$ touch ab ba
$ shopt -s extglob

$ echo *a*
ab ba
$ echo !(a)*a*
ab ba
$ echo *a*!(a)
ab
现在看起来像是
!()
匹配空字符串,但为什么
*a*!(a) 
匹配
ba

我假设在第二个例子中,
ab
是这样匹配的

!(a) ->  ""
*    ->  ""
a    ->  "a"
*    ->  "b"
在第三种情况下,这反过来会建议匹配
ba
,如下所示

*    ->  "b"
a    ->  "a"
*    ->  ""
!(a) ->  ""
但看起来这不管用

即使考虑到贪婪,这对我来说也没有任何意义。我错过了什么

编辑:

我在GNUBash上,版本4.1.7(2)-发行版(i386-apple-darwin10.4.0)

这确实很奇怪。我可以模仿你的行为。奇怪之处在于
*
字符后面的
*
。当我执行您的代码时:

$ echo *a*!(a)
ab
。。。正如你所描述的那样。 但是如果我跳过第二个
*
,它将匹配两个文件

$ echo *a!(a)
ab ba
这意味着匹配的元素应该是正确的。问题是,为什么第二个星号与第一个示例中的空字符串不匹配。正如文档中所说,它应该匹配空字符串,但这似乎不能正常工作

也许我们的bash版本与文档不匹配

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.
这项工作:()用于消除歧义

echo @(*a*)!(a)
echo !(a)@(*a*)
奇怪:
*a*!(a) c
,匹配
abc
bac
(这是正常行为)

这是一个

切特·拉米写道
[…]这将在下一版本中修复


gnubash,版本4.1.5(1)-发行版(x86_64-pc-linux-GNU)
上也有同样的行为,现在,我假设这是bash中的一个bug。我的错误报告: