실수로 생성된 zsh 명령을 정의 해제하는 방법은 무엇입니까?

실수로 생성된 zsh 명령을 정의 해제하는 방법은 무엇입니까?

모든 Python 파일에서 ".vars()" 문자열을 검색하고 싶고 어떻게든 "grep"을 다음과 같이 재정의했습니다.

% grep .vars() *.py                                                         
% which grep
grep () {
    *.py
}

이 문제를 사용 unset grep하고 수정하려고 시도했지만 성공하지 못했습니다. export grep=/bin/grep내가 실수로 한 일을 누군가 설명해 줄 수 있나요?

참고: Bash에서는 다음과 같이 실패합니다.

"예기치 않은 표시 '('" 근처에 구문 오류가 있습니다.

답변1

여기에는 두 개의 함수가 정의되어 있습니다. 하나는 이름이 지정 grep되고 다른 하나는 이름이 지정 됩니다 vars.*.py

grep .vars() *.py                                                         

이러한 기능을 제거하고 섀도우를 취소하려면 다음을 grep수행해야 합니다.

$ unset -f grep .vars

에서 man zshbuiltins:

unset [ -fmv ] name ...
        ...
        unset -f is equivalent to unfunction.
...
unfunction
        Same as unhash -f.
...
unhash
        ...
        The  -f  option causes unhash to remove shell functions.

답변2

이것은 함수 정의입니다. 보다 정확하게는 동일한 코드로 두 개의 함수를 정의하는 것입니다. zsh에는 함수 정의의 기본 구문에 대한 여러 확장이 있기 때문에 이상해 보입니다 name () { instruction; … }.

  • Zsh는 여러 이름을 허용합니다. 함수 와 동일한 본문이 name1 name2 () { instruction; … }정의 되어 있습니다. 나는 이것을 지원하는 다른 쉘을 알지 못합니다.name1name2
  • Zsh에서는 .함수 이름을 입력할 수 있습니다(예: bash, 대시 또는 ksh93은 제외). 이식 가능한 함수 이름에는 ASCII 문자, 숫자, 밑줄만 사용할 수 있습니다.
  • Zsh에서는 모든 명령을 함수 본문으로 사용할 수 있습니다. 일부 셸(특히 bash)에는 복합 명령이 필요합니다(모두 POSIX 요구 사항임).
    name () { instruction; … }
    
    주제가 그룹인 가장 일반적인 형태입니다.
    name () ( instruction; )
    
    또한 이식성이 뛰어나며 서브셸에서 함수 본문을 실행합니다. 다음과 같은 다른 복합 명령은 기술적으로 유효합니다.
    name () if condition; then instruction1; else instruction2; fi
    
    POSIX 표준을 따르는 함수 정의이지만 실제로는 극히 드뭅니다.
    name () echo hello
    
    이는 zsh(및 ksh 및 dash)에 따르면 완벽하게 유효한 함수 정의이지만 POSIX 또는 bash에 따르면 그렇지 않습니다.
  • ()모든 셸에서 앞의 공백은 선택 사항입니다.

효과를 실행 취소하려면 grep .vars() *.py두 기능을 모두 설정 해제하세요.

unset -f grep .vars

또는

unfunction grep .vars

답변3

당신은기능. 이는 현재 쉘 내에서만 작동합니다.

간단한 기능은 다음과 같습니다

f() echo hello

이제 "f" 명령이 인사할 것입니다.

$ f
hello

이를 지우는 가장 쉬운 방법은 unset -f명령을 사용하는 것입니다.

귀하의 경우:

unset -f grep

관련 정보