zsh: есть ли проблема с постоянным включением расширенного глобинга?

Вопрос или проблема

Я недавно наткнулся на

setopt extended_glob

…для включения расширенного глоббинга, который позволяет использовать множество классных добавлений с подстановочными знаками, таких как исключение конкретных шаблонов, например:

ls ^foo*

…использует ls для каждого пути в вашем текущем каталоге, кроме шаблонов, соответствующих foo*.

Я нашел один учебник, который предлагает добавить setopt extended_glob в ваш .zshrc, но я полагаю, что поскольку многие шаблоны конфигурации zsh не включают эту опцию, и опция является отключенной по умолчанию, это имеет свои недостатки или даже побочные эффекты?

Или это абсолютно безвредно всегда включать extended_glob путем добавления его в .zshrc?

Я предполагаю, что потенциальная проблема заключается в том, что ^ является вполне допустимым символом в именах файлов, поэтому значение шаблона, содержащего его, меняется в зависимости от того, установлена ли опция или нет:

$ touch 'foo' 'bar' '^foo' '^bar'
$ ls ^foo*
^foo
$ setopt extendedglob
$ ls ^foo*           
bar  ^bar  ^foo

Стандартная оболочка будет воспринимать ^ как обычный символ, поэтому эта функция, вероятно, отключена по умолчанию для совместимости.

Пока вы помните, какие опции включены, т.е. знаете, как оболочка интерпретирует глоббинги, оставлять extended_glob включенным не должно быть проблемой в интерактивном использовании.

Для скриптов, которые не ожидают этого, но используют странные имена файлов, это может быть проблемой, но неинтерактивные оболочки не должны читать .zshrc, так что установка его там должна быть в порядке. Просто не устанавливайте его в .zshenv.


Расширенные глоббинги в стиле ksh (@(...|...) и т.д., setopt kshglob) имеют подобную проблему в том, что они конфликтуют с тем, как zsh обрабатывает круглые скобки в глоббингах. @(f|b) имеет разные значения в зависимости от того, установлена ли kshglob или нет.

Ответ или решение

Вопрос о том, стоит ли всегда включать расширенное подстановочное соответствие (extended glob) в Zsh, действительно имеет свои нюансы. Рассмотрим эту тему подробнее.

Определение проблемы с расширенным подстановочным соответствием

Расширенное подстановочное соответствие, активируемое командой setopt extended_glob, позволяет использовать более сложные и гибкие шаблоны для работы с файлами и директориями. Например, команда ls ^foo* выводит все файлы в текущем каталоге, кроме тех, которые начинаются с "foo".

Однако стоит учитывать, что эта функция не включена по умолчанию, чтобы избежать конфликтов с обычными файлами, поскольку символ ^ может встречаться в именах файлов.

Потенциальные проблемы с активным extended glob

  1. Правила интерпретации шаблонов:
    Если вы включите опцию extended_glob, поведение Zsh изменится. Например, если вы создадите файлы с именами foo, bar, ^foo и ^bar, то команда ls ^foo* будет работать по-разному в зависимости от того, установлена ли опция extended_glob. Это может привести к путанице, особенно если скрипты написаны для стандартного поведения оболочки, в качестве данных которых используются имена файлов, содержащие символ ^.

  2. Совместимость скриптов:
    Если вы пишете скрипты, которые не ожидают использования расширенного подстановочного соответствия, это может вызвать неожиданные результаты. Например, обычные скрипты, не предназначенные для работы с Zsh и ее функционалом, могут некорректно обработать файлы с символом ^.

  3. Обсуждение установки опции в конфигурационных файлах:
    Рекомендуется включать setopt extended_glob в файл .zshrc, так как этот файл загружается при запуске интерактивной оболочки. Однако, важно помнить, что это не повлияет на неинтерактивные сценарии, которые используют другую иерархию конфигурации. Избегайте установки данной опции в файле .zshenv, так как это приведет ко всем сеансам оболочки, включая неинтерактивные.

Доброжелательный подход к использованию

Если вы активно используете Zsh и понимаете, как работает extended_glob, его включение не должно вызывать значительных проблем в вашей повседневной работе. Это также не критично в контексте взаимодействия с файловой системой в интерактивном режиме. Главное — помнить, какие опции включены, и быть готовым к изменению поведения оболочки, например, при передаче скриптов в другие окружения или при обмене с другими пользователями.

Заключение

Таким образом, активация параметра extended_glob в .zshrc является приемлемой в большинстве случаев, если вы уверены в контексте использования ваших команд и понимаете, как они будут обрабатываться. Тем не менее, всегда хорошей практикой является разделение интерактивных и сценарных настроек и внимание к возможным конфликтациям с именами файлов, особенно если они требуют строгой совместимости с другими оболочками.

Запомните: ваше понимание функционала Zsh — это залог вашей продуктивности и безошибочной работы в среде командной строки.

Оцените материал
Добавить комментарий

Капча загружается...