如何修复此 SSH 主机名选项卡完成脚本?

Nic*_*ole 6 bash autocomplete shell-script

找到了以下脚本(用于 bash),它使我能够为我连接到的任何主机名(来自~/.ssh/known_hosts)获取制表符补全:

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh
Run Code Online (Sandbox Code Playgroud)

但是,问题是在我输入用户名后选项卡完成不起作用。

我该如何改进,所以如果我输入...

ssh myusername@my 
Run Code Online (Sandbox Code Playgroud)

并期望它完成“myhostname.com”它就能做到吗?

如果它也可以选择整个字符串(user@hostname)会更好,但我可以接受任何一个选项。没有第一个,除非我的主机用户名与本地用户名匹配,否则这没什么用。

Hau*_*ing 1

如果$COMP_WORDBREAKS包含“@”(这是我系统上的默认设置),则会出现我无法解决的严重问题(按后TabEnter一个“@”被删除)。

但是,如果您从该环境变量中删除它,那么这是有效的:

_foo () {
  if [[ "$COMP_WORDBREAKS" =~ "@" ]]; then
    echo ""
    echo '$COMP_WORDBREAKS contains "@"; aborting'
    COMPREPLY=()
  else
    at_in=no
    if [[ ${COMP_WORDS[COMP_CWORD]} =~ "@" ]]; then
      var="${COMP_WORDS[COMP_CWORD]}"
      tail="${var#*@}"
      prefix="${var%"$tail"}"
    else
      prefix=""
    fi
    COMPREPLY=($(cut -f 1 -d ' ' <~/.ssh/known_hosts |
      sed -e 's/,/\n/g' | uniq |
      awk -v prefix="${prefix}" '/\[/ {next}; {print prefix $0;}'))
    COMPREPLY=($(compgen -W "${COMPREPLY[*]}" "${COMP_WORDS[COMP_CWORD]}"))
  fi
}

complete -F _foo ssh
Run Code Online (Sandbox Code Playgroud)