Ответы:
Цитирование из спецификации 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 о 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).
Linux людей-страница ссылка POSIX.2, 3,13.
man
, man glob
или человеко-страницы , чтобы присутствовать? Я не мог найти мужчину здесь (к моему удивлению).
Насколько я могу сказать, LSB 4.1 не требует bash
и только sh
.
За sh
ним следует POSIX (с одним второстепенным не относящимся к делу расширением).
bash
не всегда соответствует POSIX. только когда он вызывается какsh
.