Поведение. * Включить. и ... определены в LSB или POSIX или в какой-либо другой спецификации?


Ответы:


10

Цитирование из спецификации Unix версии 2, том «Команды и утилиты», §2.13.3 :

Если имя файла начинается с period ( .), период должен явно совпадать, используя точку в качестве первого символа шаблона или сразу после символа косой черты. (…) Не указано, может ли явный период в списке соответствия выражений в скобках, например, [.abc]совпадать с начальным периодом в имени файла.

Не существует исключения, при котором второй период ..или пустая строка, следующая за единственным периодом ., не совпадают с подстановочным знаком в .*. Поэтому в стандарте говорится, что это .*соответствует, .и.. , хотя это может раздражать.

В приведенном выше отрывке описывается поведение оболочки ( shкоманды). Раздел о globфункции библиотеки C ссылается на этот отрывок.

Язык точно такой же, как в версии 3 , также известной как POSIX: 2001 и IEEE 1003.1-2001, которая используется в большинстве современных систем.

Dash, bash и ksh93 соответствуют POSIX. Пдкш и зш (даже под emulate sh) нет.

В ksh вы можете .*пропустить .и .., установив FIGNORE='.?(.)', но у этого есть побочный эффект создания *файлов точек. Или вы можете установить FIGNORE='.*', но тогда .*ничего не соответствует.

В bash вы можете .*пропустить .и .., установив GLOBIGNORE='.:..', но это побочный эффект от *включения файлов точек. Или вы можете установить GLOBIGNORE='.*', но тогда .*ничего не соответствует.


примечание: bashне всегда соответствует POSIX. только когда он вызывается как sh.
стружка

4

Вероятно, вы имеете в виду функциональность в расширении bash о 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 или другими оболочками (или такими программами, как grep).



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.