3

鉴于这些文件:

$ ls
file1  file2  file21  file3  fileFoo

我期望这种 globbing 模式(启用 extglob 的 bash):

$ ls file?({1..2}|Foo)

输出:

file1  file2  fileFoo

但相反,我fileFoo列出了两次:

$ ls file?({1..2}|Foo)
file1  file2  fileFoo  fileFoo

“或”的两边都不会产生意想不到的结果:

$ ls file?({1..2})
file1  file2

$ ls file?(Foo)
fileFoo

那么为什么fileFoo在我“或”表达式时打印两次,以及匹配范围(例如上面的 1-2 但可能是 17-593 或任何其他范围)或其他一些不相关的字符串(例如上面的 Foo )?

$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)
4

2 回答 2

2

在 globbing 之前执行扩展:

file?({1..2}|Foo) 

变成

file?(1|Foo) file?(2|Foo)

然后两个参数都是全局的。

仅使用以下扩展按预期工作,但会绊倒nullglob等:

file{{1..2},Foo}
于 2017-06-08T00:14:03.133 回答
2

它被解释为:

ls file?(1|Foo) file?(2|Foo)

范围正在扩大,然后每​​个值都与|Foo.

因此,当扩展每个模式时,您会得到以数字结尾的文件和以Foo.

尝试:

ls file{{1..2},Foo)
于 2017-06-08T00:16:17.677 回答