как bash делает `ssh` автозаполнение? - PullRequest
0 голосов
/ 01 мая 2020

У меня установлен пакет "bash -completion".

ssh Завершение в командной строке (в bash) работает: ssh TAB-TAB завершит последние использованные хосты и ssh -TAB-TAB завершит доступные ssh опции.

Однако, когда я ищу текущие определенные завершения:

$ complete | grep ssh
complete -F _known_hosts ssh-installkeys
complete -F _service /etc/init.d/ssh

... Я обнаружил, что для ssh не зарегистрировано никакого завершения? !

complete -p ssh
bash: complete: ssh: no completion specification

Когда я проверяю сценарий завершений ssh в /usr/share/bash-completion/completions/ssh, я вижу, что он действительно регистрирует завершений:

$ grep complete /usr/share/bash-completion/completions/ssh | grep ssh | grep -v '^#'
shopt -u hostcomplete && complete -F _ssh ssh slogin autossh sidedoor

Так почему же завершение s sh не отображается в complete | grep ssh? Как выполняет bash опции ssh?

1 Ответ

0 голосов
/ 01 мая 2020

Если для команды (или функции, или чего-либо еще) не определено завершение, тогда включается завершитель «по умолчанию».

Этот завершитель по умолчанию можно увидеть здесь:

$ complete -p -D
complete -F _completion_loader -D

Когда установлен пакет bash-completion, он будет получать /usr/share/bash-completion/bash_completion через /etc/bash.bashrc и назначать функцию _completion_loader.

_completion_loader будет динамически спецификация загрузки c завершается после запроса на завершение команд, о которых завершитель оболочки еще не знает (см. здесь ).

В случае ssh терминалы, где я выполнял осмотр еще не загрузил завершитель ssh, поэтому я не видел его с complete | grep ssh или complete -p ssh. Только в тот момент, когда вы нажимаете TAB-TAB в первый раз , загружается завершитель для ssh.

...