Zsh는 유틸리티 차별화를 수행합니다.

Zsh는 유틸리티 차별화를 수행합니다.

유틸리티/파일이 실행 가능한 바이너리나 스크립트인지, 단순한 파일인지, 쉘 내장 등인지 Zsh는 어떻게 구별합니까?

답변1

명령 위치에 단어가 나타나면 zsh는 먼저 그것이 단어인지 확인합니다.별명또는예약어. 이는 구문 분석의 일부로 초기에 발생합니다. Zsh는 각각에 대한 내부 테이블을 가지고 있기 때문에 예약어와 별칭을 이해합니다. 또한 특정 접미사로 끝나는 단어는 접미사가 .ext로 정의된 활성 접미사 별칭의 형태인 경우 alias -s ext=…일반 별칭과 유사한 방식으로 확장됩니다 . 예약어는 zsh 소스 코드에서 수정됩니다(비활성화할 수 있는 경우 제외). 별칭은 런타임에 정의될 수 있습니다.

zsh가 준비되면주문 실행, 명령 위치에 있는 단어의 경우:

  • 내부 테이블에 해당 단어가 나타나는 경우기능, 함수로 실행됩니다. 함수는 런타임에 정의될 수 있습니다.
  • 그렇지 않으면 해당 단어가 내부 테이블에 나타나면내장 기능. zsh의 소스 코드에는 초기 내장 함수 세트가 있지만 추가 내장 함수는 다음을 통해 정의할 수 있습니다.동적으로 로드된 모듈.
  • 그렇지 않은 경우auto_cd옵션설정된 경우 단어는 디렉토리에 대한 경로이고 명령은 인수를 사용하지 않으며 zsh는 명령이 해당 cd단어를 인수로 사용하는 것처럼 동작합니다.
  • 그렇지 않으면 zsh는 해당 단어를 외부 명령의 이름으로 처리합니다. 그것은 다음을 수행합니다PATH찾다시스템 기능과 마찬가지로execvp, 대부분의 쉘과 마찬가지로 zsh는 execve이를 직접 호출합니다.
  • 외부 명령 실행 시도가 실패했지만 일치하는 파일이 존재하는 경우 zsh는 파일 내용에 따라 간접적으로 명령 실행을 시도할 수 있습니다.
    • 파일이 로 시작하면 #!zsh는 해당 줄에서 인터프리터 경로를 읽고 인터프리터 호출을 시도합니다. 이것은셰르본기구. 최신 시스템에서는 커널이 이를 처리하므로 zsh 구현은 일부 고대 시스템에서만 필요합니다.
    • 그렇지 않고 파일이 텍스트 파일처럼 보이면 zsh가 /bin/sh이를 호출합니다. 이 동작은 shebang 메커니즘이 존재하기 전과 사람들이 쉘 스크립트를 명령 검색 경로에 넣은 다음 sh.
  • 이들 중 어느 것도 명령을 실행할 수 없으면 zsh가 해당 기능을 실행합니다.command_not_found_handler, 존재하는 경우. 이 함수는 일반적으로 "'foo' 명령을 찾을 수 없지만 sudo apt install somepackage를 사용하여 설치할 수 있습니다"와 같은 메시지를 인쇄하는 데 사용되지만, 다른 방식으로 명령을 실행하려고 시도할 수도 있습니다.

관련 정보