0

我已经安装了“bash-completion”包。

ssh命令行上的完成(in 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我发现它确实注册了ssh完成:

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

那么为什么 ssh 完成不显示complete | grep ssh呢?bash如何完成ssh选项?

4

1 回答 1

0

如果没有为命令(或函数或其他)定义完成,则“默认”完成器将启动。

该默认完成者可以在这里看到:

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

安装bash-completion软件包后,它将/usr/share/bash-completion/bash_completion通过源/etc/bash.bashrc获取并分配_completion_loader功能。

_completion_loader将根据 shell 的完成者还不知道的命令的完成请求动态加载特定的完成者(参见此处)。

在 的情况下ssh,我正在四处寻找的终端尚未加载ssh完成程序,因此我看不到它complete | grep sshcomplete -p ssh。只有在您第一次ssh按 TAB-TAB 时才会加载完成者。

于 2020-05-01T14:12:07.807 回答