Баш в комплекте со знаком "@" - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь создать скрипт автозаполнения для scp.Сценарий считывает имя пользователя и хоста из моего файла .ssh / config. Мой файл .ssh / config выглядит следующим образом:

Host host1
    HostName host1
    User userA
    port 22

Host host2
    HostName host2
    User userB
    port 22

Host host3
    HostName host3
    User userB
    port 22

Мой файл .autocomplete_scp.sh:

# SSH
function _scp_completion() {
    pcregrep -o -M 'HostName [a-zA-Z.]+[\n\t\s]+User [a-zA-Z]+' 
    $HOME/.ssh/config | awk 'NR % 2 == 1 { o=$2 ; next } { print $2"@"o}'
}

complete -W "$(_scp_completion)" scp

Iисточник этого файла в моем bashrc.

Теперь, когда я наберу userA и нажму Tab , функция автозаполнения даст мне userA@host1.Когда я набираю userB и нажимаю Tab , функция автозаполнения выдаст мне userB@, но я не могу получить полную строку (userB@host2 или userB@host3).

Также не работает, когда я набираю userA@h и дважды нажимаю кнопку Tab .Так что, похоже, застрял из-за знака @.(Когда я удаляю знак @ из функции _scp_completion, он работает нормально.)

Есть идеи, как это исправить?Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

Самый простой способ заставить его работать - это удалить '@' из $COMP_WORDBREAKS, иначе Bash сам обработает @.Вы можете попробовать вот так:

COMP_WORDBREAKS=${COMP_WORDBREAKS//@}
complete -W 'userA@host1 userB@host2 userB@host3' scp

Согласно bash doc:

COMP_WORDBREAKS

Набор символов, которые readline библиотека работает как разделитель слов при выполнении завершения слова.

...