Answers:
引用Single Unix规范版本2,“命令和实用程序”,第2.13.3节:
如果文件名以句点(
.
)开头,则必须使用句点作为模式的第一个字符或紧跟斜杠字符来显式匹配句点。(…)不确定括号表达式匹配列表中的显式句点是否[.abc]
可以匹配文件名中的前导句点。
没有例外,它将使in中的第二个句点..
或in中唯一的句点之后的空字符串与in中.
的通配符不匹配.*
。因此,该标准说.*
匹配.
和..
,尽管可能会令人讨厌。
上面的段落描述了shell的行为(sh
命令)。glob
C库函数部分参考了此段落。
该语言与第3版(也称为POSIX:2001和IEEE 1003.1-2001)完全相同,这是大多数当前系统所实现的语言。
Dash,bash和ksh93符合POSIX。Pdksh和zsh(甚至低于emulate sh
)也没有。
在ksh中,可以通过设置来.*
跳过.
和..
设置FIGNORE='.?(.)'
,但这具有使*
包含点文件产生的副作用。或者您可以设置FIGNORE='.*'
,但.*
不匹配任何内容。
在bash中,可以通过设置来.*
跳过.
和..
设置GLOBIGNORE='.:..'
,但这具有使*
包含点文件产生的副作用。或者您可以设置GLOBIGNORE='.*'
,但.*
不匹配任何内容。
可能您是说blob扩展中关于globignore的功能。默认情况下,bash扩展匹配。和..但是读那个人:
The GLOBIGNORE shell variable may be used to restrict the set of file names matching
a pattern. If GLOBIGNORE is set, each matching file name that also matches one of
the patterns in GLOBIGNORE is removed from the list of matches. The file names ``.''
and ``..'' are always ignored when GLOBIGNORE is set and not null. However, setting
GLOBIGNORE to a non-null value has the effect of enabling the dotglob shell option,
so all other file names beginning with a ``.'' will match. To get the old behavior
of ignoring file names beginning with a ``.'', make ``.*'' one of the patterns in
GLOBIGNORE. The dotglob option is disabled when GLOBIGNORE is unset.
您可以设置变量,GLOBIGNORE=.:..
以便在您进行如下操作时:
rm -r * .*
您仅删除当前目录。POSIX标准仅指定。是当前目录,而..在当前目录的父目录中。。*的特殊含义由bash或其他shell(或grep之类的程序)解释。
据我所知,LSB 4.1并非bash
唯一要求sh
。
对于sh
它遵循POSIX(有一个小的非相关延伸)。
bash
并不总是符合POSIX。仅当以调用时sh
。