¿Qué significa este zsh para la sintaxis?

¿Qué significa este zsh para la sintaxis?

Estoy trabajando en el control de código fuente de mis archivos dot y gran parte de lo que estoy haciendo se basa enArchivos de puntos de Zach Holman. Quiero obtener todos los archivos zsh como lo hace él en sus archivos, pero antes de agregar el código, quiero entender realmente qué está haciendo el código. El fragmento con el que estoy confundido es

# 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

Principalmente estoy confundido en cuanto a lo que está sucediendo aquí.

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

y aquí

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

Entonces, ¿qué significa todo esto?

Respuesta1

La PARAMETER EXPANSIONsección de la zshexpnpágina de manual es un buen punto de partida.

Primero, observemos que $config_fileses una matriz que incluye todos .zshlos archivos del $ZSHdirectorio, como puede ver en la segunda línea: config_files=($ZSH/**/*.zsh).

Esta sintaxis utilizada en la línea ${(M)config_files:#*/path.zsh}(tenga en cuenta que Mdentro del paréntesis se llamabandera de expansión) es el siguiente:

${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).

En otras palabras, el bucle for en cuestión itera sobre todos path.zshlos archivos en $ZSH. for file in $ZSH/**/path.zshTambién podría usarlo , pero la operación en la $config_filesmatriz de archivos es más rápida que buscar recursivamente en el sistema de archivos una y otra vez. (Hay más bucles for, ¿no?)

Con ese conocimiento, debería ser fácil descubrir qué ${${config_files:#*/path.zsh}:#*/completion.zsh}funcionará. (El resultado se indica en el comentario de todos modos).


Normalmente uso algunos ejemplos triviales para entenderme mejor:

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

Es más fácil de lo que parece, ¿verdad?;)

información relacionada