대화형 로그인 셸(zsh 또는 bash)에 입력을 시작하고 다음을 클릭하면상표, 쉘은 자동 완성 제안을 제공합니다.
완성 스펙이 어떻게 정의되는지 대략적으로 알고 있습니다. 참고로 개요는 다음과 같습니다.
- 큰 타격:https://www.gnu.org/software/bash/manual/bash.html#Programmable-Completion
- 지쉬어:http://zsh.sourceforge.net/Doc/Release/Completion-System.html
내가 이해하지 못하는 것은 사용자가 탭을 눌렀을 때 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은 를 누를 때 tab
이 complete
함수를 실행합니다.
다음에서 이를 재정의할 수 있습니다 ~/.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에도 비슷한 구현이 있을 수 있습니다.
과정도 잘 설명되어 있어요여기.