Intereting Posts
Выполнение 'ssh-add -D' из задания cron не работает Установить список приложений, разрешенных для выполнения непривилегированным пользователем Есть ли правильный способ перечислить подкаталоги текущего каталога? Исключить все файлы подчеркивания точек из rsync Есть ли инструмент командной строки unix, который может анализировать файлы шрифтов? KODi и терминал не реагируют на все кнопки с пульта дистанционного управления (rc_core) Сенсорный экран для ncurses, кроме мыши? Запуск VNC-просмотра из окон 8.1 в Debian Jessie не работает Добавить отсутствующий файл после удаления всего файла старше 90 дней Как узнать, откуда взялись последние сеансы ssh? Что предотвращает использование опции «nullok» по умолчанию для PH-конфигурации RHEL7 для пустых паролей? Создание рубина для всех пользователей Приложение не может выполнить из-за проблемы с общей библиотекой Терминал показывает искаженные символы с теми же настройками, что и другой терминал, отображающий правильные символы Блок условного исполнения с || и круглые скобки

Задание zsh для ssh сбивает имена хостов с локальными файлами

предположим, что у меня есть следующая запись в моем /etc/hosts

 192.168.1.10 server1.mydomain.com 

и у меня есть каталог SERVER-FILES в текущем каталоге. Я хочу где SERVER-FILES то scp каталог SERVER-FILES . Я печатаю SE и использую autocompletion для завершения имени каталога:

 $ scp -rp SE<TAB> 

Это завершение должно быть абсолютно недвусмысленным. Но zsh autocomplletion пытается быть слишком умным и обрабатывает имена хостов без учета регистра и, таким образом, пытается сопоставить SE с именами хостов:

 $ scp -rp SE<TAB> SERVER-FILES/ server1.mydomain.com 

Как отключить эту раздражающую функцию, где zsh пытается совместить имена хостов без учета регистра, и поэтому завершает SE<TAB> to server1.mydomain.com`?

Я изменил следующую строку в файле завершения ssh Unix/_ssh :

 - compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts + compadd "$@" $config_hosts 

но это не помогло.

Я считаю, что вы редактируете неправильную строку.

AFAIK config_hosts в Unix / _ssh ссылается на записи хоста в ~. / Ssh / config , а не / etc / hosts .

Правила завершения для / etc / hosts определены немного раньше, в следующем блоке:

 # If users-hosts matches, we shouldn't complete anything else. if [[ "$IPREFIX" == *@ ]]; then _combination -s '[:@]' my-accounts users-hosts "users=${IPREFIX/@}" hosts "$@" && return else _combination -s '[:@]' my-accounts users-hosts \ ${opt_args[-l]:+"users=${opt_args[-l]:q}"} hosts "$@" && return fi 

но это, в свою очередь, просто повторяет стиль хостов, определенный в Unix / _hosts

Поэтому, если вы редактируете определение compadd в конце файла Unix / _hosts следующим образом:

 #_wanted hosts expl host \ # compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' -a "$@" - _hosts _wanted hosts expl host \ compadd -a "$@" - _hosts 

вы должны получить нужное поведение.

PS

Обратите внимание, что редактирование общесистемных файлов завершения обычно не очень хорошая практика, поэтому вы можете просто переопределить хосты в своей локальной конфигурации ZSH, например, добавив такую ​​функцию к вашему ~. / Zsh:

 _hosts() { compadd $(getent hosts | tr -s ' ' '\t' | cut -f2) }