我试图了解扩展通配符扩展的工作原理,但遇到了以下问题。
在我当前的目录
~/t
中,我有两个文件,名为chair
和table
。对于 Bash shell,命令 ls *(a-z)*
会列出它们,但 ls *(a-z)
不会列出。为什么?我已使用 shopt -s extglob
启用了扩展通配符。
我猜
ls *(a-z)
无法列出这两个文件,因为在这种情况下,*
将扩展到 0+ 个字符,如基本通配符扩展一样,然后 (a-z)
不会扩展到任何内容。如果 (a-z)
没有扩展为任何内容,Bash 将尝试按字面匹配它。由于我当前目录中没有以 (a-z)
结尾的文件,因此命令 ls
在这种情况下会失败并且不会列出任何内容。
但是,根据我之前的推理,表达式
*(a-z)*
应该仅匹配以任意 0+ 个字符开头、后跟文字“(a-z)”、后跟 0+ 个字符的文件名。但情况似乎并非如此,因为 ls *(a-z)*
确实列出了我的文件 chair
和 table
。
~/t$ ls
chair table
~/t$ ls *(a-z)*
chair table
~/t/$ ls *(a-z)
ls: cannot access '*(a-z)': No such file or directory
因为 shell 需要方括号,而不是圆括号:
printf '%s\n' *[a-z]
产量:
chair
table