(이것은 zsh 5.7.1이 설치된 MacOS에 있습니다)
zsh에서 사용자 정의 함수를 로드하는 방법은 다음과 같습니다.
# Custom functions
fpath=($HOME/.zfunc $fpath)
autoload -Uz mackupbackup
autoload -Uz tac
autoload -Uz airplane
autoload -Uz wakeMyDesktop
각 함수는 ~/.zfunc
디렉토리에 있는 자체 파일입니다. 이후 이 디렉토리는 다른 디렉토리에 심볼릭 링크되어 있습니다 mackup
.
현재 커밋 해시를 클립보드에 복사하는 새로운 함수를 작성했습니다. $fpath 라는 파일을 만들고 ghash
, 함수를 작성하고, autoload
my 에 새 줄을 추가 .zshrc
하고 실행했습니다 source ~/.zshrc
.
이것은 기능입니다
# copy the commit hash of the given git reference, or HEAD if none is given
ref=$1
if [[ $ref ]]; then
git rev-parse $1 | pbcopy
else
git rev-parse HEAD | pbcopy
fi
구매 후 .zshrc
기능을 사용할 수 있게 되어 작동하지만 작동 확인을 인쇄하기 위해 다음 줄을 추가하고 싶습니다.
echo "Copied $(pbpaste) to clipboard"
그래서 해당 줄을 추가하고 파일을 저장한 다음 .zshrc
다시 가져왔습니다.
함수를 다시 실행했지만 동작이 바뀌지 않았습니다!
제가 뭔가 잘못하고 있는 것 같아 계속해서 기능을 바꾸고 소싱을 변경했지만 .zshrc
소용이 없었습니다. 전체적으로 .zshrc
리소스를 22번 다시 가져왔는데, 그 시점에서 작업을 완료하는 데 37초가 걸렸습니다.
그러다가 함수를 다시 로드하는 것이 아닐 수도 있다는 것을 깨닫고 zsh
start 새 인스턴스를 실행했고(약 1초 소요) 함수가 예상대로 작동하기 시작했습니다!
source
새 기능을 선택했지만 기능이 변경된 후 업데이트되지 않은 이유를 아는 사람이 있습니까 ?
source ~/.zshrc
보너스 질문: 실행할 때마다 시간이 더 오래 걸리는 이유는 무엇입니까?
답변1
실제로 사람들이 멱등성이 있도록 파일을 작성하는 경우가 거의 없기 때문에 rc 파일을 가져오는 경우는 거의 없습니다. 일반적인 예는 매번 동일한 디렉터리를 경로 앞에 추가하는 사용자의 경우입니다 fpath
. 이는 물론 해당 경로를 검색하는 데 매번 시간이 더 오래 걸린다는 의미입니다. 그리고 의심할 바 없이, 이곳이 이런 종류의 일을 할 수 있는 유일한 장소는 아닙니다.
또한 자동 로딩을 올바르게 이해하지 못합니다. 문서에 나와 있듯이 본문이 없는 함수는 자동으로 로드됩니다.해당 기능이 처음 실행될 때. 분명히, 함수가 이미 로드되어 함수 본문이 있으면 다시 로드되지 않습니다.
함수를 다시 호출하기 전에 해당 함수를 호출해야 합니다 unfunction
.autoload
.zshrc
Z 쉘 소스의 예freload()
인수 뒤에 이름이 지정된 모든 함수에 대해 이 작업을 수행하는 함수가 포함되어 있습니다 . typeset -U path cdpath fpath manpath
그렇습니다.
답변2
autoload
a는 zsh에서 name
첫 번째 참조 시 자동으로 로드되는 것으로 표시되어 있지만 이름이 이미 정의된 경우 이름이 정의된 후에 이미 참조되므로 동일한 이름을 가진 기존 함수를 재정의하지 않습니다. 원하는 것을 얻으려면 .zshrc
함수를 다시 소싱하기 전에 정의를 해제해야 합니다. 또는 더 간단하게 하려면 자동 로딩용 래퍼 함수를 생성하여 주어진 함수 이름이 정의되어 있는지 확인하고, 그렇다면 태그에 자동으로 로드되었습니다. 정의를 해제하기 전에 다시 한 번 확인하세요.
시도할 때마다 구매 속도가 느려지는 이유에 대해서는 .zshrc
대답할 수 없습니다 .zshrc
.