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
Это проще, чем кажется, верно ?! ;)