我正在使用LS实用程序和我的命令如下所示:
$ ls x?[a-c]*
这样的命令的输出是什么?到目前为止,我理解(并且我希望这是正确的)它将列出以下项目:
- 以 x 开头
- 第三个字母是 {a,b,c}
- 第三个字母之后的任何内容(无关紧要)都包含在内
我的问题是,什么是?(问号)代表什么情况?
先感谢您。
答案1
它不是一个ls
功能,它是一个bash
功能,它在“模式匹配”部分中进行了描述重击(1):
特殊模式字符的含义如下:
*
匹配任何字符串,包括空字符串。当。。。的时候
globstar
shell 选项已启用,并且*
用于路径名扩展上下文中,两个相邻的*
用作单个模式将匹配所有文件以及零个或多个目录和子目录。如果后面跟着一个/
, 两个相邻的*
s 将仅匹配目录和子目录。?
匹配任何单个字符。
[...]
匹配任何一个包含的字符。由连字符分隔的一对字符表示范围表达式;使用当前语言环境的整理序列和字符集,匹配位于这两个字符之间的任何字符(包括这两个字符)。如果后面的第一个字符
[
是一个!
或一个^
那么任何未包含的字符都会被匹配。范围表达式中字符的排序顺序由当前区域设置和LC_COLLATE
或者LC_ALL
shell 变量(如果已设置)。为了获得范围表达式的传统解释,其中[a-d]
相当于[abcd]
,设定值LC_ALL
外壳变量为C
,或启用globasciiranges
外壳选项。 A-
可以通过将其作为集合中的第一个或最后一个字符来进行匹配。 A]
可以通过将其作为集合中的第一个字符来进行匹配。
您的理解也不完全正确 -?
表示任何单个字符,因此表达式x?[a-c]*
将匹配xQcFoo.bar
,xmabc
而且- 重点是这也可能是第二个字母,x1a
而不仅仅是第三个字母。命令的输出将是匹配模式的文件列表 。或者,如果没有这样的文件,shell 将不会用任何内容替换,因此将尝试列出字面名称为.xabc
{a,b,c}
ls x?[a-c]*
x?[a-c]*
x?[a-c]*
ls
x?[a-c]*