заполнение клавишей Tab для идентификаторов

Очень часто я должен использовать идентификатор для команды. Например,

ssh server1-name

Очевидно, если я должен был совершить нападки [tab] при вводе server1 -name часть идентификатора строки не завершилась бы. Существует ли путь в ударе, чтобы заставить это работать?

Это ясно работает на другие идентификаторы как имена каталогов. т.е.

cd /var/www/ht[tab] приведет к cd /var/www/html существует ли причина, она не работает на вещи как ssh?

1
задан 8 November 2017 в 18:54

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

К сожалению, я не могу протестировать его прямо сейчас, но можно просто судить их обоих. Второй выглядит намного более простым мне, я ожидал бы, что это будет работать быстрее.

2
ответ дан 7 December 2019 в 13:29

Другие вопросы по тегам:

Похожие вопросы: