![.* 的行为是否包括 .和 .. 在 LSB 或 POSIX 或其他规范中定义?](https://linux22.com/image/374/.*%20%E7%9A%84%E8%A1%8C%E4%B8%BA%E6%98%AF%E5%90%A6%E5%8C%85%E6%8B%AC%20.%E5%92%8C%20..%20%E5%9C%A8%20LSB%20%E6%88%96%20POSIX%20%E6%88%96%E5%85%B6%E4%BB%96%E8%A7%84%E8%8C%83%E4%B8%AD%E5%AE%9A%E4%B9%89%EF%BC%9F.png)
的行为是在 LSB 或 POSIX 或其他规范中.*
包含.
和定义的吗?..
答案1
引用自单一 Unix 规范版本 2,卷“命令与实用程序”,§2.13.3:
如果文件名以句点 (
.
) 开头,则必须通过使用句点作为模式的第一个字符或紧跟在斜杠字符后面来显式匹配句点。 (…) 未指定括号表达式匹配列表中的显式句点(例如,[.abc]
是否可以匹配文件名中的前导句点)。
毫无例外, 中的第二个句点..
或 中唯一句点后面的空字符串与.
中的通配符不匹配.*
。因此标准说.*
匹配.
和..
,尽管这可能很烦人。
上面的段落描述了 shell(sh
命令)的行为。关于C库函数的部分glob
引用了这段话。
语言完全一样版本3,也称为 POSIX:2001 和 IEEE 1003.1-2001,这是大多数当前系统所实现的。
Dash、bash 和 ksh93 符合 POSIX。 Pdksh 和 zsh(甚至在 下emulate sh
)不会。
在 ksh 中,您可以通过设置来.*
跳过.
和设置 ,但这会产生包含点文件的副作用。或者您可以设置, 但 then不匹配任何内容。..
FIGNORE='.?(.)'
*
FIGNORE='.*'
.*
在bash中,您可以通过设置来.*
跳过.
和设置,但这会产生包含点文件的副作用。或者您可以设置, 但 then不匹配任何内容。..
GLOBIGNORE='.:..'
*
GLOBIGNORE='.*'
.*
答案2
可能你指的是 bash 扩展中关于 globigore 的功能。默认情况下 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 等程序)解释。
答案3
这Linux 手册页参考 POSIX.2、3.13。
答案4
据我所知,LSB 4.1 不需要bash
且仅需要sh
.
为了sh
它遵循 POSIX(带有一个次要的不相关扩展)。