Прокрутіть вниз ...
Імена файлів .
і ..
завжди ігноруються, коли GLOBIGNORE
встановлено, а не є недійсним.
У більшості випадків це не бажано включати .
і ..
як підстановочні відповідники, оскільки вони не представляють файли всередині каталогу - вони хакі, щоб змусити роботу навігації по каталогу. Насправді походження точкових файлів - це помилка у ранній версії ls
команди . Автор мав на увазі виключити .
та ..
зі списку, але випадково виключив усі файли, що починаються .
. Таким чином файли крапок стали приховані від ls
. Снаряди слідували за костюмом, ховаючи файли крапок ls
. Однак спосіб цього було знову злому: файли, що починаються з .
, виключаються, лише якщо точка явно не узгоджується з шаблоном. Отже, візерунок .*
включає .
і ..
.
Щоб зберегти сумісність із існуючими сценаріями, сучасні оболонки все ще включають .
та ..
(крім zsh, який у цьому питанні, як і багато інших, має безпечнішу, але не відсталу поведінку). Однак якщо ви встановите GLOBIGNORE
, ви використовуєте функцію, характерну для bash, яка показує, що вас не цікавить зворотна сумісність. Тому зміни відповідності шаблонів слід виключати .
і ..
з усіх збігів шаблонів.
Налаштування GLOBIGNORE=.
виключає файл, який автоматично виключається будь-коли, коли GLOBIGNORE
це встановлено, тому він еквівалентний, shopt -s dotglob
крім цього, .
і ..
, крім того, виключається з усіх шаблонів.
GLOBIGNORE
лише ігнорує.
і..
в шаблонах без косої риси, і GLOBIGNORE фільтрує шляхи файлів, а не імена файлів.GLOBIGNORE=.; echo .*
не буде включати.
ні..
, алеGLOBIGNORE=.; echo ./.*
(абоecho /bin/.*
) буде! Для того, щоб ігнорувати.
і..
від всіх грудок, це виглядає , як вам потрібноshopt -s extglob
іGLOBIGNORE='?(*/)@(.|..)'
.