구문에 대한 zsh는 무엇을 의미합니까?

구문에 대한 zsh는 무엇을 의미합니까?

나는 내 도트파일을 제어하는 ​​소스 작업을 하고 있으며 내가 하는 일의 대부분은 다음을 기반으로 합니다.Zach Holman의 도트파일. 나는 그가 그의 파일에서 하는 것처럼 모든 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

보기보다 쉽죠?!;)

관련 정보