Bash/Zsh는 완료 중에 관련 명령을 어떻게 식별합니까?

Bash/Zsh는 완료 중에 관련 명령을 어떻게 식별합니까?

대화형 로그인 셸(zsh 또는 bash)에 입력을 시작하고 다음을 클릭하면상표, 쉘은 자동 완성 제안을 제공합니다.

완성 스펙이 어떻게 정의되는지 대략적으로 알고 있습니다. 참고로 개요는 다음과 같습니다.

내가 이해하지 못하는 것은 사용자가 탭을 눌렀을 때 bash/zsh가 어떤 명령이 완료되어야 하는지 인식하는 방법입니다. 즉, 이 작업을 수행하면 ls [tab]bash/zsh가 어떻게 인식합니까 ls? 즉, bash/zsh는 ls완성 사양을 사용하여 완성을 생성하는 방법을 어떻게 알 수 있습니까?

좀 더 복잡한 구문 분석이 포함된 몇 가지 예가 더 있습니다. Bash/Zsh는 여전히 정확합니다.

  • ls [tab] -> 완료됨ls
  • echo $( echo $(ls [tab] -> 완료됨ls
  • echo hi; git a[tab] -> 완료됨git
  • echo 'cd [tab] -> 완료되지 않음cd
  • echo "$(ls [tab] -> 완료됨ls
  • echo $( echo hi | ls [tab] -> 완료 ls
    (stdin이 허용되지 않는다는 것을 알고 있지만 ls이 예에서는 여전히 bash/zsh의 구문 분석 기능을 보여줍니다)

나는 bash/zsh가 일종의 파서를 사용하고 있다고 가정합니다. 그러나 이는 일반적인 파서가 아닙니다. 적절하게 구성된 명령이 없어도 수행할 수 있습니다. 닫히지 않은 경우에도 따옴표나 셸 확장으로 묶인 내용이 있다는 것을 알고 있습니다.

bash/zsh는 관련 명령을 "식별"하거나 완료해야 할 명령이 있는지 확인하기 위해 어떤 기능을 실행합니까?

답변1

bash/zsh는 관련 명령을 "식별"하거나 완료해야 할 명령이 있는지 확인하기 위해 어떤 기능을 실행합니까?

readline은 를 누를 때 tabcomplete함수를 실행합니다.

다음에서 이를 재정의할 수 있습니다 ~/.inputrc.

"\t": complete

complete로써 정의 된 lib/readline/funmap.c:

static const FUNMAP default_funmap[] = {
[..]
{ "complete", rl_complete },

rl_complete허용 lib/readline/complete.c(소스 코드 찾아보기):

/* Complete the word at or before point.  You have supplied the function
   that does the initial simple matching selection algorithm (see
   rl_completion_matches ()).  The default is to do filename completion. */
int
rl_complete (int ignore, int invoking_key)
{
..

이것이 출발점입니다. 단어를 분해하여 어떤 완성이 등록되어 있는지 확인한 후, 관련된 완성을 찾아냅니다.

zsh에도 비슷한 구현이 있을 수 있습니다.

과정도 잘 설명되어 있어요여기.

관련 정보