Оболочка Ubuntu 20.04 -нажатие клавиши TAB показывает странный «вывод автозаполнения»

У меня была аналогичная проблема (на Fedora 29, хотя ):мне казалось, что мою /etc/cgconfig.confполностью игнорировали. Бег

sudo systemctl enable cgconfig

и перезагрузка решила проблему.

2
07.04.2021, 17:08
1 ответ

Я предполагаю, что ваша оболочка - Bash. Я могу воспроизвести вашу проблему, переопределив evalследующим образом:

eval() { echo "$1"; }

или аналогично. Функции завершения используют eval. Они ожидают, что evalбудетevalвстроенной оболочкой . Если evalподделаны, они могут вести себя неправильно.

Мои тесты показывают, что evalкак псевдоним или исполняемый файл не нарушает завершение, поэтому, скорее всего, в вашем случае это функция.

Вызов

type eval

Обычно вывод должен быть eval is a shell builtin. Если вы получите eval is a function, вызовите

unset -f eval

и проверьте, ведут ли себя дополнения лучше (или хотя бы по-другому ).

Вы должны выяснить, откуда берется функция. Ручной метод заключается в проверке файлов запуска(~/.bashrcи т.п.)и всего, что из них исходит. Есть лучшие методы. Действуйте следующим образом:

shopt -s extdebug   # enable extra debugging info
declare -F eval

Это сообщит вам номер строки и исходный файл. (Наконец, запустите shopt -u extdebug, чтобы отключить отладку.)

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

После того, как вы найдете определение этой функции eval, избавьтесь от нее и пусть evalбудет встроенной функцией. Примечания:

  • Удаление определения не приведет к автоматическому исправлению уже запущенных оболочек. Создайте новую оболочку; выйти и войти в систему; если сомневаетесь, перезагрузитесь.
  • Удаление определения приведет к поломке всего, что действительно нуждается в этой функции, поэтому может потребоваться дальнейшее исследование :по какой причине эта функция была здесь? Рассмотрите возможность переименования вместо удаления (хотя бы первоначально, временно ), на случай, если код в определении не является одноразовым.
  • Функция может быть определена более одного раза (, и последнее полученное определение имеет преимущество ). Если удаление определения не возвращает встроенную функцию, вероятно, осталось определение. Повторите метод.

Если завершения не полностью исправлены, проверьте выходные данные declare -Fи проверьте наличие других функций, которые заменяют встроенные (используйте compgen -b, чтобы знать, что искать ). При необходимости проанализируйте их, как вы только что сделали с eval, и исправьте аналогичным образом.

3
28.04.2021, 22:53

Теги

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