Вопрос или проблема
Я использую 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
, хотя сам скрипт и функция, кажется, работают корректно локально. Давайте разберем возможные причины неполадки и предложим решения.
Теория:
-
Суть команды
complete -F
: Bash позволяет добавлять пользовательские функции автодополнения с помощью командыcomplete -F
. Это дает возможность связать функцию автозаполнения с конкретной командой или префиксом так, чтобы при вводе пользователь мог воспользоваться автозаполнением. -
Источник проблемы: Когда вы добавляете новую команду автозаполнения с
complete -F
, важно учитывать, что функция автодополнения лишь предоставляет возможные варианты; она не выполняется напрямую при нажатии на клавишу Tab. Это означает, что ваш_dummyfunc
будет запущен лишь в контексте предоставления вариантов для обеспечения автозаполнения, а не в момент завершения команды. -
Конфигурация Bash: Если конфигурация Bash некорректна или не поддерживает пользовательские функции автодополнения, то это может стать причиной ошибки. Параметры конфигурации могут ограничивать некоторые функциональности без повышенных привилегий.
Пример:
Вы уже проверили существование функции через команду complete -p
, которая подтвердила регистрацию вашей функции автозаполнения для команды ttt
. Также функция _dummyfunc
работает, если вы вызываете ее напрямую. Но, похоже, она не используется корректно в контексте автозаполнения. Это предполагает, что что-то в процессе создаёт блокировку или не воспринимается так, как предполагалось изначально.
Применение:
-
Проверьте Вашу конфигурацию
.bashrc
: Удостоверьтесь, что все компоненты, связанные сbash_completion
, корректно загружаются. Поскольку у вас нет правsudo
, вы не можете модифицировать системные файлы, но любая ошибка в.bashrc
может влиять на поведение команд. -
Убедитесь, что использование Tab правильно нацелено: Некоторые пользователи сталкиваются с тем, что нажатие на Tab поочередно может сработать или не сработать из-за разных интерактивных процессов, перехватывающих ввод, особенно если в сессии SSH перенаправляются потоки или она открыта с ограничением по интерактивности.
-
Диагностика через другой подход: Попробуйте создать альтернативный метод тестирования вашей функции автодополнения. Вместо отображения простых сообщений воспользуйтесь возвратом отладочной информации, например, через
echo
. Так ваша функция укажет в выводе на стадии срабатывания. -
Проверка ограничений SSH-сессии: В некоторых случаях ограничения, наложенные через SSH-сессию, могут препятствовать корректной работе некоторых частей bash. Попробуйте проверить настройки сеанса и вероятные ограничения, которые могут быть введены администратором сети.
-
Работа с дев/сценарным окружением: Если ошибка сохраняется, лучшим решением будет протестировать вашу функцию в изолированной инсталляции или на локальном уровне, чтобы удостовериться, что код функции и ее регистрация в
complete
не содержат опечаток или синтаксис не искажен.
Таким образом, подходя к проблеме системно и применяя дедукцию и индукцию для анализа среды выполнения, вы сможете выявить источник неполадки и, возможно, оправіть её, улучшив взаимодействие с удаленной оболочкой bash. Вам стоит внимательно тестировать каждый компонент вашей конфигурации и функции, чтобы исключить мелкие ошибки, влияющие на общее поведение.