Что означает этот zsh для синтаксиса?

469
Rumel

Я работаю над источником, контролирующим мои точечные файлы, и большая часть того, что я делаю, основана на точечных файлах Зака ​​Холмана . Я хочу получить исходные тексты всех файлов zsh, как он это делает в своих файлах, но прежде чем я просто добавлю туда код, я хочу на самом деле понять, что делает код. Фрагмент, с которым я запутался,

# all of our zsh files typeset -U config_files config_files=($ZSH/**/*.zsh)  # load the path files for file in ${(M)config_files:#*/path.zsh} do source $file done  # load everything but the path and completion files for file in ${$:#*/completion.zsh} do source $file done  # initialize autocomplete here, otherwise functions won't be loaded autoload -U compinit compinit  # load every completion after autocomplete loads for file in ${(M)config_files:#*/completion.zsh} do source $file done  unset config_files 

В основном я запутался в том, что здесь происходит

${(M)config_files:#*/path.zsh}

и здесь

${$:#*/completion.zsh}

Так что все это значит?

4

1 ответ на вопрос

4
mpy

PARAMETER EXPANSIONЧасть zshexpnстраницы человека является хорошей отправной точкой.

Во- первых, давайте заметим, что $config_filesпредставляет собой массив, включая все .zshфайлы в $ZSHкаталоге, вы можете увидеть во второй строке: config_files=($ZSH/**/*.zsh).

Этот синтаксис, используемый в строке ${(M)config_files:#*/path.zsh}(обратите внимание, что Mвнутри скобок называется флагом расширения ), выглядит следующим образом:

$ If the pattern matches the value of name, then substitute the  empty string; otherwise, just substitute the value of name.  If name is an array the matching array elements are removed  (use the `(M)' flag to remove the non-matched elements). 

Другими словами, рассматриваемый цикл for перебирает все path.zshфайлы в $ ZSH. Вы также можете использовать for file in $ZSH/**/path.zsh, но операция с $config_filesмассивом файлов выполняется быстрее, чем рекурсивный поиск файловой системы снова и снова. (Есть больше для цикла, не так ли?)

С этим знанием должно быть легко понять, что ${$:#*/completion.zsh}будет делать. (Результат указан в комментарии так или иначе).


Я обычно использую несколько тривиальных примеров, чтобы лучше понять себя:

$ array=(foo bar baz) $ print $ foo bar baz $ print $ foo $ print ${(M)array:#ba*} bar baz 

Это проще, чем кажется, верно ?! ;)

Похожие вопросы