這個 zsh for 語法是什麼意思?

這個 zsh for 語法是什麼意思?

我致力於原始碼控制我的點文件,我正在做的很多事情都是基於扎克·霍爾曼的點文件。我想像他在他的文件中那樣獲取所有 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 ${${config_files:#*/path.zsh}:#*/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}

和這裡

${${config_files:#*/path.zsh}:#*/completion.zsh}

那麼,這意味著什麼?

答案1

PARAMETER EXPANSION手冊頁的這一部分zshexpn是一個很好的起點。

首先,請注意這是一個包含目錄下$config_files所有檔案的數組,如第二行所示:。.zsh$ZSHconfig_files=($ZSH/**/*.zsh)

該行中使用的語法${(M)config_files:#*/path.zsh}(請注意,M括號內稱為擴展標誌)如下:

${name:#pattern}
          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比一次又一次遞歸地搜索文件系統要快。 (還有更多的 for 循環,不是嗎?)

有了這些知識,應該很容易弄清楚${${config_files:#*/path.zsh}:#*/completion.zsh}要做什麼。 (無論如何,結果已在評論中說明)。


我通常會使用一些簡單的例子來更好地了解自己:

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

這比看起來更容易,對吧?;)

相關內容