zsh에서 함수 검색 경로 ($ fpath)는 디렉토리 세트를 정의합니다. 디렉토리에는 포함 된 함수가 처음 필요할 때 자동으로로드되도록 표시 될 수있는 파일이 있습니다.
Zsh에는 두 가지 자동로드 파일 모드가 있습니다. Zsh의 기본 방식과 ksh의 자동로드와 비슷한 다른 모드입니다. KSH_AUTOLOAD 옵션이 설정되면 후자가 활성화됩니다. Zsh의 기본 모드는 기본값이며 여기서 다른 방법은 설명하지 않습니다 (ksh 스타일 자동로드에 대한 자세한 내용은 "man zshmisc"및 "man zshoptions"참조).
괜찮아. `~ / .zfunc '디렉토리가 있고 함수 검색 경로의 일부가되기를 원한다고 가정하면 다음과 같습니다.
fpath=( ~/.zfunc "${fpath[@]}" )
검색 디렉토리 앞에 개인 디렉토리가 추가 됩니다. zsh 설치의 함수를 사용자가 직접 재정의하려는 경우 (예 : 셸의 이전 버전이 설치된 zsh CVS 저장소의`_git '와 같은 업데이트 된 완료 함수를 사용하려는 경우)에 중요합니다.
`$ fpath '의 디렉토리는 재귀 적으로 검색되지 않는다는 점도 주목할 가치가있다. 비공개 디렉토리를 재귀 적으로 검색하려면 다음과 같이 직접 처리해야합니다 (다음 스 니펫에는 'EXTENDED_GLOB'옵션을 설정해야 함).
fpath=(
~/.zfuncs
~/.zfuncs/**/*~*/(CVS)#(/N)
"${fpath[@]}"
)
훈련받지 않은 눈에는 암호처럼 보이지만 실제로는`~ / .zfunc '아래의 모든 디렉토리를`$ fpath'에 추가하고 "CVS"라는 디렉토리는 무시합니다 (전체를 체크 아웃하려는 경우 유용합니다) zsh의 CVS에서 개인 검색 경로로의 함수 트리).
다음 줄을 포함하는`~ / .zfunc / hello '파일이 있다고 가정 해 봅시다.
printf 'Hello world.\n'
이제 첫 번째 참조시 함수가 자동으로로드되도록 표시 하면됩니다.
autoload -Uz hello
"-Uz는 무엇입니까?"라고 묻습니까? 글쎄, 그것은 어떤 옵션이 설정되어 있든`autoload '가 올바른 일을하게하는 일련의 옵션 일 뿐이다. `U '는 함수가로드되는 동안 앨리어스 확장을 비활성화하고`z'는 어떤 이유로 든`KSH_AUTOLOAD '가 설정되어 있어도 zsh 스타일의 자동 로딩을 강제합니다.
처리가 끝나면 새로운 'hello'기능을 사용할 수 있습니다.
zsh % 안녕하세요
안녕 세상.
이 파일을 소싱하는 것에 관한 한마디 : 그건 잘못이야 . `~ / .zfunc / hello '파일을 소싱하면 "Hello world"만 인쇄됩니다. 한번. 더 이상 없습니다. 기능이 정의되지 않습니다. 게다가 아이디어는 필요할 때만 함수 코드를로드하는 것입니다 . `autoload '호출 후 함수의 정의는 읽히지 않습니다 . 이 기능은 필요에 따라 나중에 자동로드되도록 표시되어 있습니다.
마지막으로 $ FPATH 및 $ fpath에 대한 참고 사항 : Zsh는이를 연결된 매개 변수로 유지합니다. 소문자 매개 변수는 배열입니다. 대문자 버전은 문자열 스칼라로, 항목 사이에 콜론으로 연결된 연결된 배열의 항목을 포함합니다. 스칼라 목록을 처리하는 것은 배열을 사용하는 것이 훨씬 자연스럽고 스칼라 매개 변수를 사용하는 코드에 대한 하위 호환성을 유지하기 때문에 수행됩니다. $ FPATH (스칼라)를 사용하기로 선택한 경우 다음을주의해야합니다.
FPATH=~/.zfunc:$FPATH
작동하지만 다음은 작동하지 않습니다.
FPATH="~/.zfunc:$FPATH"
큰 따옴표 안에 물결표 확장이 수행되지 않기 때문입니다. 문제의 원인 일 수 있습니다. 경우 echo $FPATH
물결표 아닌 확장 경로를 인쇄 한 후 작동하지 않습니다. 안전을 위해 다음과 같은 물결표 대신 $ HOME을 사용합니다.
FPATH="$HOME/.zfunc:$FPATH"
즉,이 설명의 맨 위에서했던 것처럼 배열 매개 변수를 사용하는 것이 좋습니다.
또한 $ FPATH 매개 변수를 내 보내지 않아야합니다. 현재 쉘 프로세스에서만 필요하며 하위 프로세스에서는 필요하지 않습니다.
최신 정보
`$ fpath '에있는 파일의 내용과 관련하여 :
zsh 스타일 자동로드를 사용하면 파일의 내용이 파일의 본문이 정의됩니다. 따라서 행을 포함하는 "hello"라는 파일은 "hello"라는 echo "Hello world."
함수를 완전히 정의합니다. hello () { ... }
코드를 자유롭게 넣을 수
있지만 불필요합니다.
그러나 하나의 파일에 하나의 기능 만 포함 할 수 있다는 주장은 완전히 정확하지는 않습니다.
특히 함수 기반 완성 시스템 (compsys)에서 일부 함수를 살펴보면 이것이 잘못된 개념이라는 것을 빨리 알게 될 것입니다. 기능 파일에서 추가 기능을 자유롭게 정의 할 수 있습니다. 또한 함수를 처음 호출 할 때 수행해야하는 모든 종류의 초기화를 자유롭게 수행 할 수 있습니다. 그러나 이렇게하면 항상 파일에서 파일과 같은 이름의 함수를 정의하고 파일 끝에서 해당 함수 를 호출 하므로 함수가 처음 참조 될 때 실행됩니다.
하위 함수를 사용하여 파일 내의 파일과 같은 이름의 함수를 정의하지 않은 경우 해당 함수에 함수 정의가있는 해당 함수 (즉, 파일의 하위 함수의 함수)가 생깁니다. 파일과 같은 이름의 함수를 호출 할 때마다 모든 하위 함수를 효과적으로 정의합니다. 일반적으로 이것은 원하는 것이 아니므로 파일 내의 파일과 같은 이름의 함수를 재정의합니다.
짧은 골격을 포함시켜 그 작동 방식에 대한 아이디어를 제공합니다.
# Let's again assume that these are the contents of a file called "hello".
# You may run arbitrary code in here, that will run the first time the
# function is referenced. Commonly, that is initialisation code. For example
# the `_tmux' completion function does exactly that.
echo initialising...
# You may also define additional functions in here. Note, that these
# functions are visible in global scope, so it is paramount to take
# care when you're naming these so you do not shadow existing commands or
# redefine existing functions.
hello_helper_one () {
printf 'Hello'
}
hello_helper_two () {
printf 'world.'
}
# Now you should redefine the "hello" function (which currently contains
# all the code from the file) to something that covers its actual
# functionality. After that, the two helper functions along with the core
# function will be defined and visible in global scope.
hello () {
printf '%s %s\n' "$(hello_helper_one)" "$(hello_helper_two)"
}
# Finally run the redefined function with the same arguments as the current
# run. If this is left out, the functionality implemented by the newly
# defined "hello" function is not executed upon its first call. So:
hello "$@"
이 바보 같은 예제를 실행하면 첫 번째 실행은 다음과 같습니다.
zsh % 안녕하세요
초기화 중 ...
안녕 세상.
그리고 연속 통화는 다음과 같습니다.
zsh % 안녕하세요
안녕하세요 세계.
이것이 문제를 해결하기를 바랍니다.
(이 모든 트릭을 사용하는보다 복잡한 실제 예제 중 하나는 zsh의 함수 기반 완료 시스템에서 이미 언급 한` _tmux '함수입니다.)