Вопрос или проблема
Я недавно наткнулся на
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
-
Правила интерпретации шаблонов:
Если вы включите опциюextended_glob
, поведение Zsh изменится. Например, если вы создадите файлы с именамиfoo
,bar
,^foo
и^bar
, то командаls ^foo*
будет работать по-разному в зависимости от того, установлена ли опцияextended_glob
. Это может привести к путанице, особенно если скрипты написаны для стандартного поведения оболочки, в качестве данных которых используются имена файлов, содержащие символ^
. -
Совместимость скриптов:
Если вы пишете скрипты, которые не ожидают использования расширенного подстановочного соответствия, это может вызвать неожиданные результаты. Например, обычные скрипты, не предназначенные для работы с Zsh и ее функционалом, могут некорректно обработать файлы с символом^
. -
Обсуждение установки опции в конфигурационных файлах:
Рекомендуется включатьsetopt extended_glob
в файл.zshrc
, так как этот файл загружается при запуске интерактивной оболочки. Однако, важно помнить, что это не повлияет на неинтерактивные сценарии, которые используют другую иерархию конфигурации. Избегайте установки данной опции в файле.zshenv
, так как это приведет ко всем сеансам оболочки, включая неинтерактивные.
Доброжелательный подход к использованию
Если вы активно используете Zsh и понимаете, как работает extended_glob
, его включение не должно вызывать значительных проблем в вашей повседневной работе. Это также не критично в контексте взаимодействия с файловой системой в интерактивном режиме. Главное — помнить, какие опции включены, и быть готовым к изменению поведения оболочки, например, при передаче скриптов в другие окружения или при обмене с другими пользователями.
Заключение
Таким образом, активация параметра extended_glob
в .zshrc
является приемлемой в большинстве случаев, если вы уверены в контексте использования ваших команд и понимаете, как они будут обрабатываться. Тем не менее, всегда хорошей практикой является разделение интерактивных и сценарных настроек и внимание к возможным конфликтациям с именами файлов, особенно если они требуют строгой совместимости с другими оболочками.
Запомните: ваше понимание функционала Zsh — это залог вашей продуктивности и безошибочной работы в среде командной строки.