함수가 어딘가에 선언되고 해당 함수의 이름이 "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
함수 정의의 가능한 모든 변형을 포착하기 위한 적절한 명령을 이미 제공했습니다 .
두 가지 점을 더 추가하고 싶습니다.
파일 목록을 얻으려면실제로읽어 들인 경우(예: 비표준 파일은 다른 파일에서 소스가 될 수 있습니다!) 옵션을 활성화하여 호출할 수
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>
이 ,,grep-approach''를 사용하면 다음과 같은 기능을 포착할 수 없습니다.자동 로드됨내장을 통해
autoload
. 따라서 다음 사항도 확인하십시오fpath
.$ for i ($fpath) { ls -l "$i"/cp }