Як працює GLOBIGNORE?


15

Відповідно до сторінки керівництва bash:

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

Однак на практиці ...

$ bash --noprofile --norc
bash-4.2$ touch .bar
bash-4.2$ echo .*
. .. .bar
bash-4.2$ GLOBIGNORE=.
bash-4.2$ echo .*
.bar

Чому ..вилучається зі списку збігів? Наскільки я знаю, шаблон .НЕ відповідає .., чи не так?

Відповіді:


14

Прокрутіть вниз ...

Імена файлів .і ..завжди ігноруються, коли GLOBIGNOREвстановлено, а не є недійсним.

У більшості випадків це не бажано включати .і ..як підстановочні відповідники, оскільки вони не представляють файли всередині каталогу - вони хакі, щоб змусити роботу навігації по каталогу. Насправді походження точкових файлів - це помилка у ранній версії lsкоманди . Автор мав на увазі виключити .та ..зі списку, але випадково виключив усі файли, що починаються .. Таким чином файли крапок стали приховані від ls. Снаряди слідували за костюмом, ховаючи файли крапок ls. Однак спосіб цього було знову злому: файли, що починаються з ., виключаються, лише якщо точка явно не узгоджується з шаблоном. Отже, візерунок .*включає .і ...

Щоб зберегти сумісність із існуючими сценаріями, сучасні оболонки все ще включають .та ..(крім zsh, який у цьому питанні, як і багато інших, має безпечнішу, але не відсталу поведінку). Однак якщо ви встановите GLOBIGNORE, ви використовуєте функцію, характерну для bash, яка показує, що вас не цікавить зворотна сумісність. Тому зміни відповідності шаблонів слід виключати .і ..з усіх збігів шаблонів.

Налаштування GLOBIGNORE=.виключає файл, який автоматично виключається будь-коли, коли GLOBIGNOREце встановлено, тому він еквівалентний, shopt -s dotglobкрім цього, .і .., крім того, виключається з усіх шаблонів.


1
Насправді я лише зрозумів, що налаштування GLOBIGNOREлише ігнорує .і ..в шаблонах без косої риси, і GLOBIGNORE фільтрує шляхи файлів, а не імена файлів. GLOBIGNORE=.; echo .*не буде включати .ні .., але GLOBIGNORE=.; echo ./.*(або echo /bin/.*) буде! Для того, щоб ігнорувати .і ..від всіх грудок, це виглядає , як вам потрібно shopt -s extglobі GLOBIGNORE='?(*/)@(.|..)'.
Стефан Шазелас

1
Власне, ні, GLOBIGNORE='?(*/)@(.|..)'не вдалося б виключити .і ..в .*/foo. GLOBIGNORE='?(*/)@(.|..)?(/*)'зламав би ./*
глобуси,

3

З розділу під назвою "Розширення шляху" в man bash:

Імена файлів ''. '' І '' .. '' завжди ігноруються, коли GLOBIGNORE встановлено, а не є недійсним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.