【发布时间】:2021-11-08 17:32:59
【问题描述】:
我编写了一个简单的 bash 完成脚本来完成列表中的 ssh 服务器名,例如:
_ssh()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts=$(cat $hosts | awk -F';' '{print $2}')
COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
return 0
}
complete -F _ssh ssh
$opts 列表是这样的:
locationX-apache-01.local.lan
locationY-apache-02.local.lan
locationX-mysql-01.local.lan
locationY-mysql-02.local.lan
如果我写 $ ssh loca<TAB> 的话,Bash 补全会按预期工作……但是如果我不从头开始,我怎么能得到建议:
$ ssh apac<TAB> 从上面的列表中获取 2 个 apache 服务器:
locationX-apache-01.local.lan
locationY-apache-02.local.lan
【问题讨论】:
-
不要忘记可能的
ssh user@host。您需要将$cur拆分为user和host部分,匹配host,然后将user附加到结果中。 -
将您的主机放入您的
.ssh/config文件中,默认的 bash 补全将拾取并使用它们。
标签: bash bash-completion