zsh에서 함수 소스 찾기

zsh에서 함수 소스 찾기

함수가 어딘가에 선언되고 해당 함수의 이름이 "cp"로 지정되어 일반적인 cp 동작을 재정의하는 zsh 셸에 이 성가신 문제가 있습니다. 함수 선언을 찾으려고 하는데 찾을 수 없습니다. 나는 이미 .zshrc의 일반 위치와 .zshrc에 포함된 다양한 다른 소스를 살펴봤지만 지금까지는 아무 것도 없습니다.

내가 시도한 다른 것들:

  • grep -r 'function cp' .(~에서)
  • whence -f cp(함수 정의를 제공하지만 선언된 위치는 제공하지 않음)

어떤 아이디어가 있나요?

답변1

우선, function키워드 없이 함수를 정의할 수 있으므로 더 나은 검색이 가능합니다.

grep 'cp()' .*

.zshrc그러면 and .profile및 기타 등등 의 파일을 검색합니다 . 아무것도 찾지 못하면 zsh. 이는 다음의 맨 끝에 나열되어 있습니다 man zsh.

FILES
       $ZDOTDIR/.zshenv
       $ZDOTDIR/.zprofile
       $ZDOTDIR/.zshrc
       $ZDOTDIR/.zlogin
       $ZDOTDIR/.zlogout
       ${TMPPREFIX}*   (default is /tmp/zsh*)
       /etc/zsh/zshenv
       /etc/zsh/zprofile
       /etc/zsh/zshrc
       /etc/zsh/zlogin
       /etc/zsh/zlogout    (installation-specific - /etc is the default)

기본적 $ZDOTDIR으로 $HOME. 따라서 이 명령은 문제가 있는 파일을 찾아야 합니다.

grep 'cp()\|cp ()' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin /etc/zsh/zshenv \
 /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin 

\|함수 이름과 함수 자체 사이에 공백을 둘 수도 있으므로 를 추가했습니다 . 마지막으로,@Dennis가 지적함키워드 를 사용하면 괄호를 생략할 수도 있습니다 function. 따라서 더욱 안전하려면 다음과 같이 하십시오.

grep -E 'function cp|cp *\(\)' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin \
  /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin 

답변2

오늘 이 작업을 수행해야 했고 whence -v함수 정의가 포함된 파일을 출력한다는 것을 알았습니다.

$ whence -v function_name
function_name is a shell function from /path/to/file

답변3

최신 버전의 zsh(5.4부터 커밋에 추가됨)34f70c5) 모듈 $functions_source의 일부로 배열을 지원합니다 zsh/parameter(문서: man zshmodules):

functions_source

이 읽기 전용 연관 배열은 활성화된 기능의 이름을 기능의 소스가 포함된 파일 이름에 매핑합니다.

이미 로드되었거나 절대 경로를 사용하여 자동 로드하도록 표시되었거나 해당 경로가 ' functions -r'로 확인된 자동 로드 함수의 경우 이는 자동 로드를 위해 찾은 파일이며 절대 경로로 확인됩니다.

스크립트 또는 소스 파일의 본문 내에 정의된 함수의 경우 이는 해당 파일의 이름입니다. 이 경우 해당 파일에 원래 사용된 정확한 경로이며 상대 경로일 수 있습니다.

대화형 프롬프트에 정의된 기능이나 경로가 아직 확인되지 않은 자동 로드 기능을 포함한 다른 기능의 경우 이는 빈 문자열입니다. 그러나 해시 요소는 함수가 존재하는 한 정의된 대로 보고됩니다. 이 해시에 대한 키는 에 대한 키와 동일합니다 $functions.

그래서 당신은 할 수 있습니다

echo $functions_source[cp]

답변4

Terdon의 답변grep함수 정의의 가능한 모든 변형을 포착하기 위한 적절한 명령을 이미 제공했습니다 .

두 가지 점을 더 추가하고 싶습니다.

  1. 파일 목록을 얻으려면실제로읽어 들인 경우(예: 비표준 파일은 다른 파일에서 소스가 될 수 있습니다!) 옵션을 활성화하여 호출할 수 zsh있습니다 SOURCE_TRACE.

    $ zsh -o sourcetrace
    +/etc/zshenv:1> <sourcetrace>
    +/home/user/.zshrc:1> <sourcetrace>
    +/home/user/.zcompdump:1> <sourcetrace>
    +/home/user/.zshrc-last:1> <sourcetrace>
    
  2. 이 ,,grep-approach''를 사용하면 다음과 같은 기능을 포착할 수 없습니다.자동 로드됨내장을 통해 autoload. 따라서 다음 사항도 확인하십시오 fpath.

    $ for i ($fpath) { ls -l "$i"/cp }
    

관련 정보