Прокрутите вниз ...
Имена файлов .
и ..
всегда игнорируются, когда GLOBIGNORE
установлено, а не ноль.
Большая часть времени, это не желательно включать .
и в ..
качестве подстановочных матчей, так как они не представляют собой файлы в директории - они писаки , чтобы сделать каталог навигацию работы. Фактически, происхождение точечных файлов является ошибкой в ранней версии ls
команды . Автор хотел исключить .
и ..
из списка, но случайно исключил все файлы, которые начинаются с .
. Таким образом, точечные файлы стали скрытыми от ls
. Снаряды следовали примеру, скрывая точечные файлы вроде ls
. Однако способ, которым это было сделано, снова был хаком: файлы, начинающиеся с .
, исключаются, только если точка не соответствует явно в шаблоне. Таким образом, шаблон .*
включает в себя .
и ..
.
Чтобы сохранить совместимость с существующими сценариями, современные оболочки по-прежнему включают .
и ..
(кроме zsh, который в этом вопросе, как и многие другие, имеет более разумное, но не обратно совместимое поведение). Однако, если вы установите GLOBIGNORE
, вы используете специфичную для bash функцию, которая показывает, что вы не заинтересованы в обратной совместимости. Таким образом, сопоставление с образцом изменяется для исключения .
и ..
из всех совпадений с образцом.
Параметр GLOBIGNORE=.
исключает файл, который в любом случае автоматически исключается всякий раз, когда GLOBIGNORE
он задан, поэтому он эквивалентен shopt -s dotglob
исключению .
и ..
, кроме того, исключается из всех шаблонов.
GLOBIGNORE
только игнорирования.
и..
в шаблонах без слешей, а GLOBIGNORE фильтрует пути к файлам, а не имена файлов.GLOBIGNORE=.; echo .*
не будет включать.
ни..
, ноGLOBIGNORE=.; echo ./.*
(илиecho /bin/.*
) будет! Чтобы игнорировать.
и..
от всех шаров, похоже, что вам нужноshopt -s extglob
иGLOBIGNORE='?(*/)@(.|..)'
.GLOBIGNORE='?(*/)@(.|..)'
не исключат.
и..
в.*/foo
.GLOBIGNORE='?(*/)@(.|..)?(/*)'
сломал бы шары как./*
...Из раздела «Расширение пути» в
man bash
:источник