애플리케이션의 자동 완성이 쉘에 의해 수행됩니까?

애플리케이션의 자동 완성이 쉘에 의해 수행됩니까?

입력 evince하고 Tab 키를 누르면 bash 쉘은 를 통해 열 수 있는 모든 파일을 나열합니다 evince. 이는 파일 이름의 ext 부분을 기반으로 하는 것으로 보입니다.

이 작업은 쉘에 의해 수행됩니까, 아니면 애플리케이션에 의해 수행됩니까 evince?

전자인 경우, 쉘은 애플리케이션에 필요한 것이 무엇인지 어떻게 알 수 있습니까?

답변1

쉘에서 실행

여기에는 두 가지 별도의 질문이 있습니다.

어디서 끝났어?구현,
기타 소프트웨어 구성요소그것이 속해있나요?.

완성된 구현은 기본적으로 셸의 일부인 명령줄 편집기와 긴밀하게 상호 작용합니다.필요쉘에서 실행하십시오.

완성의 대부분은 다음과 같이 구현됩니다.쉘 기능대부분의 껍질에서;

개별 포장

그것이 애플리케이션의 일부인지, 아니면 셸의 일부인지 묻습니다.
실제로는 첫 번째도 두 번째도 아니고 별개입니다.

Ubuntu에서 대부분의 완료는 다음과 같습니다.개별 포장 bash-completion, 예상한 만큼 완성된 작업입니다.
Bash의 일부는 아니지만 독립적으로 관리 및 게시됩니다.

암호

완성된 예제를 살펴보겠습니다 evince.

$ apt-file list bash-completion | grep evince
bash-completion: /usr/share/bash-completion/completions/evince
$ ls -l /usr/share/bash-completion/completions/evince
-rw-r--r-- 1 root root 967 Apr  7 16:10 /usr/share/bash-completion/completions/evince

흥미로운! PDF 뷰어 완성과 같은 일반적인 것을 찾는 대신 evince.

이 파일에는 쉘 함수의 구현이 포함되어 있습니다. 그 중 일부는 명령줄에서 이를 사용하는 방법을 설명하는 문자열 상수로 구성됩니다 evince. 가장 흥미로운 부분입니다./usr/share/bash-completion/completions/evince예:

_evince() {
    [  ...  ]
    case $prev in --gdk-no-debug|--gtk-module|--gtk-debug|--gtk-no-debug|\
        -p|--page-label|-i|--page-index|-l|--find|--display)
    [  ...  ]
    _filedir '@(@(?(e)ps|?(E)PS|[pf]df|[PF]DF[...]|bmp|xpm|ico|xwd|tga|pcx)'
    [  ...  ]

일반 옵션(예: ) --gtk-debug, 응용 프로그램별 옵션(예: )에 대해 설명하고 및 --page-label에서 처리할 수 있는 파일 확장자를 나열합니다 .evince.eps.pdf

소유

내장 함수를 사용하여 현재 쉘에 정의된 함수를 표시할 수 있습니다 declare. 새 셸에서 이 작업을 시도하면 오류 메시지가 표시됩니다.

$ declare -f -p _evince
bash: declare: _evince: not found

패키지가 bash-completion설치되어 있다고 가정하면 이는 기능이 아직 로드되지 않았음을 의미합니다.
하나 있으니까큰 숫자이와 같은 기능이 있고 그 중 일부만 대화형 셸 세션에서 사용되므로 시작할 때 모든 기능을 로드하는 대신 실제로 필요할 때만 기능을 로드하는 것이 합리적입니다.

함수를 로드하기 위해 Completion 을 이용해서 사용해 보려고 합니다 evince. 커서를 에 놓고 키를 누릅니다| .Tab

$ evince -|<TAB>

일부 완료가 표시될 수 있습니다. 이제 함수가 로드되어야 하며 인쇄하면 위의 파일과 같습니다.

$ declare -f -p _evince

모든 함수 이름을 나열하거나 현재 로드된 모든 함수(완료와 관련되지 않은 함수 포함)를 보려면 다음을 사용하세요.

$ declare -F | less
$ declare -f | less

관련 정보