Добавление автодополнения с complete -F не работает для удаленного сервера.

Вопрос или проблема

Я использую SSH для доступа к удалённому серверу с Ubuntu 22.04.1 LTS (у меня нет привилегий sudo). Оболочка, которую я использую, — bash.

$ echo $BASH_VERSION
5.1.16(1)-release

Когда я попытался использовать complete -F для добавления автодополнения в ~/.bashrc, у меня не получилось. Поэтому я написал функцию в отдельном скрипте, чтобы определить функцию и связать её с префиксом ttt, используя complete -F:

$ cat > deffunc.sh
_dummyfunc() {
    echo "DUMMY FUNCTION!!!"
}
$ source deffunc.sh
$ _dummyfunc
DUMMY FUNCTION!!!
$ complete -F _dummyfunc ttt
$ ttt

Но после ввода ttt и множества табуляций в командной строке ничего не произошло. Предполагалось, что выполнится _dummyfunc.

Однако, когда я ввёл e + <TAB> + <TAB> в командной строке, список автодополнения всё же появился:

$ e
e2freefrag               ebtables-nft-restore     else                     escapesrc
e2fsck                   ebtables-nft-save        enable                   ethtool
e2image                  ebtables-restore         enc2xs                   eval
e2label                  ebtables-save            encguess                 eventlogadm
e2mmpstatus              ebtablesu                enchant-2                ex
e2scrub                  ec2metadata              enchant-lsmod-2          exec
e2scrub_all              echo                     env                      exit
e2undo                   ed                       envsubst                 expand
e4crypt                  edit                     eps2eps                  expiry
e4defrag                 editor                   epylint                  export
ebtables                 egrep                    eqn                      expr
ebtablesd                eject                    era_check                extcheck
ebtables-legacy          elasticurl               era_dump                 extundelete
ebtables-legacy-restore  elastipubsub             era_invalidate           eyuvtoppm
ebtables-legacy-save     elfedit                  era_restore
ebtables-nft             elif                     esac

Также автодополнение файлов работало хорошо. Более того, complete -p указал, что префикс ttt действительно зарегистрирован:

$ complete -p | grep ttt
complete -F _dummyfunc ttt

Я уверен, что source /etc/bash_completion был выполнен в ~/.bashrc.

Дополнительная информация о конфигурации:

$ shopt -oq posix
$ echo $?
1

Кто-нибудь сталкивался с этой проблемой тоже?

Ответ или решение

Проблема с настройкой автозаполнения на удаленном сервере

В данной ситуации вам требуется реализовать автозаполнение команд под оболочкой bash на удаленном сервере, использующем Ubuntu 22.04.1 LTS. Но, несмотря на все предпринятые шаги, функция автозаполнения не срабатывает при вводе команды ttt, хотя сам скрипт и функция, кажется, работают корректно локально. Давайте разберем возможные причины неполадки и предложим решения.

Теория:

  1. Суть команды complete -F: Bash позволяет добавлять пользовательские функции автодополнения с помощью команды complete -F. Это дает возможность связать функцию автозаполнения с конкретной командой или префиксом так, чтобы при вводе пользователь мог воспользоваться автозаполнением.

  2. Источник проблемы: Когда вы добавляете новую команду автозаполнения с complete -F, важно учитывать, что функция автодополнения лишь предоставляет возможные варианты; она не выполняется напрямую при нажатии на клавишу Tab. Это означает, что ваш _dummyfunc будет запущен лишь в контексте предоставления вариантов для обеспечения автозаполнения, а не в момент завершения команды.

  3. Конфигурация Bash: Если конфигурация Bash некорректна или не поддерживает пользовательские функции автодополнения, то это может стать причиной ошибки. Параметры конфигурации могут ограничивать некоторые функциональности без повышенных привилегий.

Пример:

Вы уже проверили существование функции через команду complete -p, которая подтвердила регистрацию вашей функции автозаполнения для команды ttt. Также функция _dummyfunc работает, если вы вызываете ее напрямую. Но, похоже, она не используется корректно в контексте автозаполнения. Это предполагает, что что-то в процессе создаёт блокировку или не воспринимается так, как предполагалось изначально.

Применение:

  1. Проверьте Вашу конфигурацию .bashrc: Удостоверьтесь, что все компоненты, связанные с bash_completion, корректно загружаются. Поскольку у вас нет прав sudo, вы не можете модифицировать системные файлы, но любая ошибка в .bashrc может влиять на поведение команд.

  2. Убедитесь, что использование Tab правильно нацелено: Некоторые пользователи сталкиваются с тем, что нажатие на Tab поочередно может сработать или не сработать из-за разных интерактивных процессов, перехватывающих ввод, особенно если в сессии SSH перенаправляются потоки или она открыта с ограничением по интерактивности.

  3. Диагностика через другой подход: Попробуйте создать альтернативный метод тестирования вашей функции автодополнения. Вместо отображения простых сообщений воспользуйтесь возвратом отладочной информации, например, через echo. Так ваша функция укажет в выводе на стадии срабатывания.

  4. Проверка ограничений SSH-сессии: В некоторых случаях ограничения, наложенные через SSH-сессию, могут препятствовать корректной работе некоторых частей bash. Попробуйте проверить настройки сеанса и вероятные ограничения, которые могут быть введены администратором сети.

  5. Работа с дев/сценарным окружением: Если ошибка сохраняется, лучшим решением будет протестировать вашу функцию в изолированной инсталляции или на локальном уровне, чтобы удостовериться, что код функции и ее регистрация в complete не содержат опечаток или синтаксис не искажен.

Таким образом, подходя к проблеме системно и применяя дедукцию и индукцию для анализа среды выполнения, вы сможете выявить источник неполадки и, возможно, оправіть её, улучшив взаимодействие с удаленной оболочкой bash. Вам стоит внимательно тестировать каждый компонент вашей конфигурации и функции, чтобы исключить мелкие ошибки, влияющие на общее поведение.

Оцените материал
Добавить комментарий

Капча загружается...