标识符的制表符补全

标识符的制表符补全

我经常需要为命令使用标识符。例如,

ssh server1-name

显然,如果我[tab]在输入时点击,字符串标识符的server1部分-name将无法完成。在 bash 中有没有办法实现这一点?

它显然适用于目录名称等其他标识符。即

cd /var/www/ht[tab]会导致cd /var/www/html它不适用于 ssh 之类的东西吗?

答案1

中的条目~/.ssh/known_hosts已散列,因此无法读取bash-completion,请参阅这个错误Unix.SE 上也有类似的问题

解决方法是这个脚本(另见这里供评论)为~/.profile

_complete_ssh_hosts ()
{
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        comp_ssh_hosts=`cat ~/.ssh/known_hosts | \
                        cut -f 1 -d ' ' | \
                        sed -e s/,.*//g | \
                        grep -v ^# | \
                        uniq | \
                        grep -v "\[" ;
                cat ~/.ssh/config | \
                        grep "^Host " | \
                        awk '{print $2}'
                `
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

可以找到另一种解决此问题的尝试在 Unix.SE 上的这个答案中

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config ~/.ssh/config.d/* | grep -v '[?*]' | cut -d ' ' -f 2-)
    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

不幸的是我现在无法测试它,但你可以尝试一下两者。第二个对我来说看起来简单得多,我希望它运行得更快。

相关内容