최근 셸에서 많은 시간을 보내고 탭 자동 완성이 어떻게 작동하는지 궁금합니다. 그 뒤에있는 메커니즘은 무엇입니까? bash는 모든 디렉토리의 내용을 어떻게 압니까?
최근 셸에서 많은 시간을 보내고 탭 자동 완성이 어떻게 작동하는지 궁금합니다. 그 뒤에있는 메커니즘은 무엇입니까? bash는 모든 디렉토리의 내용을 어떻게 압니까?
답변:
자동 완성에는 두 부분이 있습니다.
fixje에서 이미 언급했듯이 readline 라이브러리는 명령 줄 편집을 관리하고 탭을 누를 때 bash를 다시 호출하여 완료를 활성화합니다. 그런 다음 Bash는 가능한 완성 목록을 제공하고 (다음 요점 참조) readline은 이미 입력 된 문자로 명확하게 식별되는만큼의 문자를 삽입합니다. readline 라이브러리를 상당히 구성 할 수 있습니다. Bash의 명령 줄 편집 섹션을 참조하십시오. 자세한 내용은 설명서를 참조하십시오.)
Bash 자체에는 complete
개별 명령에 대한 완료 메커니즘을 정의하는 내장 기능이 있습니다. 현재 명령에 대해 정의 된 것이 없으면 파일 이름으로 완성을 사용했습니다 (Ignacio가 말했듯이 opendir / readdir 사용).
자신의 완성을 정의하는 부분은 Programmable Completion 섹션에 설명되어 있습니다. 간단히 말해,
complete «options» «command»
일부 명령의 완성을 정의합니다. 예를 들어 complete -u su
말한다
의 인수 완료되면 su
현재 시스템의 사용자를 검색, 명령을 .
이것이 일반적인 옵션이 다룰 수있는 것보다 더 복잡한 경우 (예 : 인수 인덱스 또는 이전 인수에 따라 다른 완성)을 사용할 수 있습니다 -F function
. 그러면 가능한 완성 목록을 생성하는 쉘 함수를 호출합니다. (이것은 예를 들어 git 완성에 사용되며, 하위 명령과 때로는 주어진 옵션에 따라 매우 복잡하고 때로는 브랜치 이름을 사용합니다 (bash가 알지 못함).
간단히를 사용하여 현재 bash 환경에 정의 된 기존 완성을 나열하여 complete
가능한 것에 대한 인상을 가질 수 있습니다. bash-completion 패키지가 설치되어 있거나 시스템에 이름이 지정되어 있으면 많은 명령에 대한 완성이 설치되고 Wrikken이 말했듯 /etc/bash_completion
이이를 구성하기 위해 쉘 시작시 자주 실행되는 bash 스크립트가 포함됩니다. 추가 사용자 지정 완료 스크립트를에 배치 할 수 있습니다 /etc/bash_completion.d
. 그것들은 모두 /etc/bash_completion
.
/etc/bash_completion
(적어도 데비안에 많은 마법이 있습니다).