。*的行为是否包含。和..在LSB或POSIX或其他规范中定义?


Answers:


10

引用Single Unix规范版本2,“命令和实用程序”,第2.13.3节

如果文件名以句点(.)开头,则必须使用句点作为模式的第一个字符或紧跟斜杠字符来显式匹配句点。(…)不确定括号表达式匹配列表中的显式句点是否[.abc]可以匹配文件名中的前导句点。

没有例外,它将使in中的第二个句点..或in中唯一的句点之后的空字符串与in中.的通配符不匹配.*。因此,该标准说.*匹配...,尽管可能会令人讨厌。

上面的段落描述了shell的行为(sh命令)。globC库函数部分参考了此段落。

该语言与第3版(也称为POSIX:2001和IEEE 1003.1-2001)完全相同,这是大多数当前系统所实现的语言。

Dash,bash和ksh93符合POSIX。Pdksh和zsh(甚至低于emulate sh)也没有。

在ksh中,可以通过设置来.*跳过...设置FIGNORE='.?(.)',但这具有使*包含点文件产生的副作用。或者您可以设置FIGNORE='.*',但.*不匹配任何内容。

在bash中,可以通过设置来.*跳过...设置GLOBIGNORE='.:..',但这具有使*包含点文件产生的副作用。或者您可以设置GLOBIGNORE='.*',但.*不匹配任何内容。


注意:bash并不总是符合POSIX。仅当以调用时sh
13年

4

可能您是说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之类的程序)解释。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.